首页 > 编程知识 正文

java 自定义 jpanelJava更改JPanel的形状

时间:2023-05-04 12:47:49 阅读:256697 作者:3285

I'm trying to do something which I'd think would be fairly easy but can't find a straight forward answer to. Basically I want to change a JPanel's default shape to a circular shape (or any other shape other than a rectangle).

解决方案

You will need to provide your own custom painting routines.

The other problem you will have is getting the layout managers to work with it, but you can supply your own insets to provided an area within the panel that can safely used

You'll also want to make the component transparent, to allow the area outside the circle position of the component to be transparent.

Check out

You might need to also manipulate the clipping rectangle of the Graphics context. This is tricky and dangerous and if you can avoid it, I would.

Updated with example

public class CirclePaneTest {

public static void main(Stringrydhy args) {

new CirclePaneTest();

}

public CirclePaneTest() {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (Exception ex) {

}

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(new TestPane());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

public class TestPane extends JPanel {

public TestPane() {

setBackground(Color.RED);

setLayout(new GridBagLayout());

label.setHorizontalAlignment(JLabel.CENTER);

label.setVerticalAlignment(JLabel.CENTER);

// This is a test to show the usable bounds

label.setBorder(new LineBorder(Color.RED));

circlePane.setLayout(new BorderLayout());

circlePane.add(label);

add(circlePane);

}

}

public class CirclePane extends JPanel {

public CirclePane() {

setOpaque(false);

}

@Override

public Dimension getPreferredSize() {

return new Dimension(200, 200);

}

protected int getRadius() {

// Determines the radius based on the smaller of the width

// or height, so we stay symmetrical

return Math.min(getWidth(), getHeight());

}

@Override

public Insets getInsets() {

int radius = getRadius();

int xOffset = (getWidth() - radius) / 2;

int yOffset = (getHeight() - radius) / 2;

// These are magic numbers, you might like to calculate

// your own values based on your needs

Insets insets = new Insets(

return insets;

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

int radius = getRadius();

int xOffset = (getWidth() - radius) / 2;

int yOffset = (getHeight() - radius) / 2;

Graphics2D g2d = (Graphics2D) g.create();

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2d.setColor(getBackground());

g2d.fillOval(xOffset, yOffset, radius, radius);

g2d.setColor(Color.GRAY);

g2d.drawOval(xOffset, yOffset, radius, radius);

// This is test code to test the insets/usable area bounds...

// Insets insets = getInsets();

// g2d.drawRect(xOffset + insets.left,

// yOffset + insets.top,

// (xOffset + radius) - (insets.right + insets.left),

// (yOffset + radius) - (insets.bottom + insets.top));

g2d.dispose();

}

}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。