单击单选按钮时形状发生变化的 GUI 应用程序

GUI application that the shape changes on a radio button click

我的应用程序的目的是通过单击单选按钮更改背景和前景,并根据单选按钮更改项目的形状 button.I 我正在尝试让我的应用程序主动更改基于 selected.I 单选按钮的形状具有背景和前景,而不是形状。我见过另一个 post 有点像这样,但它有一个提交按钮并且不使用 JSlider

下面是我一直在弄乱的东西,似乎无法让程序正确执行。我已经改变了形状,但随后滑块断开了。我是不是用错了方法?

public class OvalPanel extends JPanel
    {


        private int diameter = 10; // default diameter

        // draw an oval of the specified diameter

        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            if(rectFillRadioButton.isSelected()){
                g.fillRect(10,10,10,10);
                //repaint();
            }
            if(ovalFillRadioButton.isSelected()){
                g.fillOval(10,10,10,10);
                //repaint();
            }
        }

        // validate and set diameter, then repaint
        public void setDiameter(int newDiameter)
        {
            // if diameter invalid, default to 10
            diameter = (newDiameter >= 0 ? newDiameter : 10);
            repaint(); // repaint panel
        }

        // used by layout manager to determine preferred size
        public Dimension getPreferredSize()
        {
            return new Dimension(200, 200);
        }

        // used by layout manager to determine minimum size
        public Dimension getMinimumSize()
        {
            return getPreferredSize();
        }
    }

这是我最初设置 paintComponent 的 class。我也有

private class TopRadioButtonHandler extends JFrame implements ItemListener {
        private Graphics panel;

        public TopRadioButtonHandler(Graphics p) {
            panel = p;
        }

        @Override
        public void itemStateChanged(ItemEvent event) {
            if(rectFillRadioButton.isSelected()){
                panel = myPanel.getGraphics();
                panel.fillRect(10,10,10,10);
                repaint();
            }
            if(ovalFillRadioButton.isSelected()){
                panel = myPanel.getGraphics();
                panel.fillOval(10,10,10,10);
                repaint();
            }

        }
    }

我认为我不需要重绘但是当我使用这种方法时我的 JSlider 停止工作。

Am i approaching this the wrong way?

是的,paintComponent() 方法不应引用另一个 Swing 组件。

当您进行自定义绘制时,paintComponent() 应该只绘制组件的当前状态。

例如,当您使用 Jlabel 时,您可以使用 setText() 和 setIcon() 等方法来设置要绘制的文本和图标。

您已经有了一个方法,setDiameter(),这是一个好的开始。但是,您的绘画代码只是硬编码 oval/rectangle 的大小。绘画方法应该参考你的直径变量。

现在,您需要另一个 属性 来指示是绘制椭圆形还是矩形。所以也许你需要一个 属性 比如 setPaintOval(boolean paintOval).

那么你的绘画代码可以是:

If (paintOval)
    g.fillOval(10, 10, diameter, diameter);
else
    g.fillRect(10, 10, diameter, diameter);

当然这种方法的问题是你只能画两个对象。

此外,您永远不应在绘画方法中调用 repaint()。 repaint() 应该只在您更改组件状态时从您的 setter 方法中调用。

but then the slider breaks

您发布的代码与滑块无关。

我猜你想让滑块改变椭圆的直径?那么您需要向滑块添加一个 ChangeListener,然后使用滑块值调用您的 setDiameter() 方法。

阅读 Swing 教程中关于 How to Use Sliders 的部分以获得工作示例。