Java GridLayout面板上有按钮和JRadioButton的第二个面板问题
我对JRadioButton、JCheckBox和其他类似组件有问题。我有一个有9个按钮的窗格,第二个窗格有一组JRadioButtons。当我将鼠标移到JRadioButton上或选择一个按钮时,它会显示在第二个按钮面板上。我在寻找答案,但我显然不知道如何命名我的问题 帧代码:Java GridLayout面板上有按钮和JRadioButton的第二个面板问题,java,swing,Java,Swing,我对JRadioButton、JCheckBox和其他类似组件有问题。我有一个有9个按钮的窗格,第二个窗格有一组JRadioButtons。当我将鼠标移到JRadioButton上或选择一个按钮时,它会显示在第二个按钮面板上。我在寻找答案,但我显然不知道如何命名我的问题 帧代码: JFrame frame = new JFrame("TicTacToe"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel
JFrame frame = new JFrame("TicTacToe");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel buttonPane = new JPanel(new GridLayout(3,3));
PlayButton b1 = new PlayButton();
buttonPane.add(b1);
PlayButton b2 = new PlayButton();
buttonPane.add(b2);
PlayButton b3 = new PlayButton();
buttonPane.add(b3);
PlayButton b4 = new PlayButton();
buttonPane.add(b4);
PlayButton b5 = new PlayButton();
buttonPane.add(b5);
PlayButton b6 = new PlayButton();
buttonPane.add(b6);
PlayButton b7 = new PlayButton();
buttonPane.add(b7);
PlayButton b8 = new PlayButton();
buttonPane.add(b8);
PlayButton b9 = new PlayButton();
buttonPane.add(b9);
JPanel chosePane = new JPanel(new GridLayout(3,1));
frame.add(chosePane, BorderLayout.EAST);
chosePane.add(new JLabel("Chose symbol which starts game: "));
ButtonGroup group = new ButtonGroup();
JRadioButton rb1 = new JRadioButton("First");
JRadioButton rb2 = new JRadioButton("Second");
group.add(rb1);
group.add(rb2);
chosePane.add(rb1);
chosePane.add(rb2);
frame.add(buttonPane, BorderLayout.WEST);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
和按钮代码:
public class PlayButton extends JButton
public PlayButton()
{
this.setPreferredSize(new Dimension(100,100));
//this.setBorder();
repaint();
}
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(5));
g2.drawLine(4,4,95,95);
g2.drawLine(4,95,95,4);
g2.setStroke(new BasicStroke(1));
}
进行自定义绘制时,需要调用
super.paintComponent(g);
作为方法中的第一条语句,确保清除背景,否则会留下绘画瑕疵
当然,如果您这样做,那么您将获得JButton的默认绘制。所以,也许您需要为您的自定义绘画扩展JComponent
另外,不要在类的构造函数中调用重绘:
它不执行任何操作,因为组件尚未添加到可见帧
Swing将确定何时需要重新绘制组件,因此除非您正在执行动画之类的操作,并且需要组件重新绘制自身,否则很少调用此方法。
编辑:
看起来你只是想在按钮上画个X。你真的不应该为这样的事情扩展JButton。您应该仅在添加新功能时扩展组件
JButton已经支持图标的显示,因此您真正想要做的是创建一个可以在按钮上使用的图标:
BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = bi.createGraphics();
g2.setColor( Color.BLACK );
g2.setStroke(new BasicStroke(5));
g2.drawLine(4,4,95,95);
g2.drawLine(4,95,95,4);
ImageIcon icon = new ImageIcon( bi );
现在,该图标可用于支持图标显示的任何组件:
JButton button = new JButton( icon );
button.setFocusPainted( false );
button.setBorder( null );
是的,它是有效的,而且JButton的默认paiting并不困扰我。而这种重新油漆是一个明显的错误。非常感谢@HoldenFord,您真的不应该扩展JButton。查看编辑以获得更好的解决方案。我想在按下按钮后重新绘制按钮,但就像错误使用此重新绘制之前的u标注一样。我同意正确的解决方案是在按下按钮后添加图标。但我不应该用画笔画这个图标,对吗?顺便说一句,我现在完全理解super的功能。按下按钮后添加图标。-你为什么要在按下按钮后添加它。绘制图标是按钮的正常状态。正如我在代码中演示的那样,在创建按钮时添加图标。这将是TictaToe游戏,因此按下按钮后,我想要X或圆圈:
JButton button = new JButton( icon );
button.setFocusPainted( false );
button.setBorder( null );