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

问题描述

我的应用程序要做的是单击单选按钮来更改背景和前景,并基于单选按钮更改项目的形状。我正在尝试让我的应用程序根据单选按钮。我的背景和前景工作的不是形状。我看到了另一种类似的帖子,但是它有一个提交按钮,并且不使用JSlider

https://i.stack.imgur.com/fZD3U.png

下面是我一直在搞的,似乎无法使程序正确执行。我已经改变了形状,但是滑块断裂了。我走错路了吗?

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);
                //repaint();
            }
            if(ovalFillRadioButton.isSelected()){
                g.filloval(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的类。我也有

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);
                repaint();
            }
            if(ovalFillRadioButton.isSelected()){
                panel = myPanel.getGraphics();
                panel.filloval(10,10);
                repaint();
            }

        }
    }

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

解决方法

我走错路了吗?

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

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

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

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

现在,您需要另一个属性来区分是绘制椭圆形还是矩形。因此,也许您需要像setPaintOval(boolean paintOval)这样的属性。

那么您的绘画代码可能是:

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

当然,这种方法的问题在于您只能绘制两个对象。

此外,您永远不要在绘画方法中调用repaint()。仅当更改组件的状态时,才可以从setter方法中调用repaint()。

但随后滑块中断

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

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

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