Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GridLayout面板上有按钮和JRadioButton的第二个面板问题_Java_Swing - Fatal编程技术网

Java GridLayout面板上有按钮和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

我对JRadioButton、JCheckBox和其他类似组件有问题。我有一个有9个按钮的窗格,第二个窗格有一组JRadioButtons。当我将鼠标移到JRadioButton上或选择一个按钮时,它会显示在第二个按钮面板上。我在寻找答案,但我显然不知道如何命名我的问题

帧代码:

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 );