【问题标题】:How to add 3 rectangles to Jpanel in java?如何在java中向Jpanel添加3个矩形?
【发布时间】:2014-10-31 21:44:50
【问题描述】:

我正在尝试将三个矩形添加到 BorderLayout 的中心,但我完全迷路了。当滑块移动时,我完成的程序需要增加矩形的高度,但我试图弄清楚如何将这三个矩形初始绘制到 jpanel。我迷路了。我的代码如下。

 import java.awt.*;
 import javax.swing.*;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;

 public class ShowColors extends JPanel
 {

public static void main(String args[])
{
    JFrame frame = new JFrame();

    JPanel main = new JPanel(new BorderLayout());
    main.setSize(2000, 1000);
    frame.setContentPane(main);

    JPanel jp1 = new JPanel(new GridLayout(0, 1));
    JPanel jp2 = new JPanel(new GridLayout(2,3));
    JPanel jp3 = new JPanel(new GridLayout(1, 3));

    jp1.setPreferredSize(new Dimension(90, 800));
    jp2.setPreferredSize(new Dimension(1000, 150));
    jp3.setPreferredSize(new Dimension(800, 600));

    JRadioButton rb1 = new JRadioButton("Decimal", true);
    JRadioButton rb2 = new JRadioButton("Binary");
    JRadioButton rb3 = new JRadioButton("Hex");
    JRadioButton rb4 = new JRadioButton("Octal");
    JButton jb1 = new JButton("RESET");

    ButtonGroup group = new ButtonGroup();
    group.add(rb1);
    group.add(rb2);
    group.add(rb3);
    group.add(rb4);

    JSlider jRed = new JSlider(0,255);
    JSlider jGreen = new JSlider(0,255);
    JSlider jBlue = new JSlider(0,255);

    jRed.setPaintLabels(true);
    jRed.setPaintTicks(true);
    jRed.setMinorTickSpacing(5);
    jRed.setMajorTickSpacing(50);
    jRed.setValue(0);

    jGreen.setPaintLabels(true);
    jGreen.setPaintTicks(true);
    jGreen.setMinorTickSpacing(5);
    jGreen.setMajorTickSpacing(50);
    jGreen.setValue(0);

    jBlue.setPaintLabels(true);
    jBlue.setPaintTicks(true);
    jBlue.setMinorTickSpacing(5);
    jBlue.setMajorTickSpacing(50);
    jBlue.setValue(0);

    JLabel labelR = new JLabel("Red", JLabel.CENTER);
    JLabel labelG = new JLabel("Green", JLabel.CENTER);
    JLabel lableB = new JLabel("Blue", JLabel.CENTER);

    jp1.add(rb1);
    jp1.add(rb2);
    jp1.add(rb3);
    jp1.add(rb4);
    jp1.add(jb1);

    jp2.add(labelR);
    jp2.add(labelG);
    jp2.add(lableB);
    jp2.add(jRed);
    jp2.add(jGreen);
    jp2.add(jBlue);

    main.add(jp1, BorderLayout.WEST);
    main.add(jp2, BorderLayout.SOUTH);

    frame.pack();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}
public void paint(Graphics g)
{
    super.paint(g);
    g.drawRect(0, 0, 10, 20);
    g.setColor(Color.RED);
    g.fillRect(0, 0, 10, 20);

    g.drawRect(10, 0, 10, 20);
    g.setColor(Color.GREEN);
    g.fillRect(10, 0, 10, 20);

    g.drawRect(20, 0, 10, 20);
    g.setColor(Color.BLUE);
    g.fillRect(20, 0, 10, 20);
}

}

这是我的布局,我想要中间的矩形。

【问题讨论】:

    标签: java layout jframe jpanel paint


    【解决方案1】:

    我认为您只需要一个简单的JPanel 子类并覆盖paintComponent()。像这样的东西应该会让你继续前进:

    import javax.swing.*;
    import java.awt.*;
    
     public class Canvas extends JPanel {
    
       // TODO member variables for rectangle size/color
    
       public void paintComponent(Graphics g) {
         super.paintComponent(g);
         g.fillRect(10,10,100,50);
         g.drawRect(10,80,100,50);
      }
    }
    

    编辑: 实际上,我猜你真的不需要“Canvas”类,你可以像@MadProgrammer 建议的那样使用普通的JPanel。您需要的是一个封装 Rectangle 行为的类,它可以是一个简单的 JComponent,添加到包含三个矩形的 JPanel

    这是一个可行的解决方案,为简洁起见排除了导入:

    public class ShowColors {
    
        class Rectangle extends JComponent implements ChangeListener {
            private JSlider slider; 
            private Color color;
    
            public Rectangle(JSlider slider, Color color) {
                this.slider = slider;
                this.color = color;
                this.setPreferredSize(new Dimension(250, 250));
                slider.addChangeListener(this);
            }
    
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                int value = slider.getValue();
                g.setColor(color);
                g.fillRect(10,10,100,value);
    
            }
    
            @Override
            public void stateChanged(ChangeEvent arg0) {
                this.repaint();
            }
        }
    
        public ShowColors() {
            JFrame frame = new JFrame();
    
            JPanel main = new JPanel(new BorderLayout());
            main.setSize(2000, 1000);
            frame.setContentPane(main);
    
            JPanel jp1 = new JPanel(new GridLayout(0, 1));
            JPanel jp2 = new JPanel(new GridLayout(2, 3));
    
            jp1.setPreferredSize(new Dimension(90, 800));
            jp2.setPreferredSize(new Dimension(1000, 150));
    
            JRadioButton rb1 = new JRadioButton("Decimal", true);
            JRadioButton rb2 = new JRadioButton("Binary");
            JRadioButton rb3 = new JRadioButton("Hex");
            JRadioButton rb4 = new JRadioButton("Octal");
            JButton jb1 = new JButton("RESET");
    
            ButtonGroup group = new ButtonGroup();
            group.add(rb1);
            group.add(rb2);
            group.add(rb3);
            group.add(rb4);
    
            JSlider jRed = buildSlider();
            JSlider jGreen = buildSlider();
            JSlider jBlue = buildSlider();
    
            JLabel labelR = new JLabel("Red", JLabel.CENTER);
            JLabel labelG = new JLabel("Green", JLabel.CENTER);
            JLabel lableB = new JLabel("Blue", JLabel.CENTER);
    
            jp1.add(rb1);
            jp1.add(rb2);
            jp1.add(rb3);
            jp1.add(rb4);
            jp1.add(jb1);
    
            jp2.add(labelR);
            jp2.add(labelG);
            jp2.add(lableB);
            jp2.add(jRed);
            jp2.add(jGreen);
            jp2.add(jBlue);
    
            JPanel canvas = new JPanel();
            canvas.setLayout(new FlowLayout());
            canvas.setPreferredSize(new Dimension(800, 600));
            canvas.add(new Rectangle(jRed, Color.RED));
            canvas.add(new Rectangle(jGreen, Color.GREEN));
            canvas.add(new Rectangle(jBlue, Color.BLUE));
    
            main.add(jp1, BorderLayout.WEST);
            main.add(jp2, BorderLayout.SOUTH);
            main.add(canvas, BorderLayout.EAST);
    
            frame.pack();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
        private static JSlider buildSlider() {
            JSlider slider = new JSlider(0, 255);
            slider.setPaintLabels(true);
            slider.setPaintTicks(true);
            slider.setMinorTickSpacing(5);
            slider.setMajorTickSpacing(50);
            slider.setValue(50);
            return slider;
        }
    
        public static void main(String args[]) {
            new ShowColors();
        }
    
    }
    

    这就是它的样子:

    【讨论】:

    • 那么使用这个类,我是不是在 main 中创建一个 Canvas 的对象并将其添加到 jpanel 中?
    • 是的,这就是一般的想法。
    • @user3242607 不,CanvasJPanel 不喜欢一起玩,你最终会画出工件和 z 顺序问题。您永远不应该混合使用重型 (AWT) 和轻型 (Swing) 组件,这不值得。如果您要开始向当前的JPanel 添加组件,那么为什么需要自定义绘画?
    • Canvas 是我的 JPanel 的子类,而不是 java.awt.Canvas!
    【解决方案2】:
    1. 不要覆盖paint,Swing中的绘画是通过一个微妙而复杂的方法链来实现的,很容易被破坏。相反,请改写它的 paintComponent 方法。详情请见Painting in AWT and Swing
    2. 话虽如此,但不要将所有组件都添加到要在其上绘制的同一面板中,否则最终会在所有组件下方进行绘制。相反,创建一个单独的JPanel 作为油漆表面,另一个JPanel 作为控制器(包含控件和油漆表面)。使用 setter 和 getter 来改变油漆表面的状态。有关详细信息,请参阅Performing Custom Painting
    3. 创建某种“可绘制”对象,它知道如何绘制自己以及应该使用什么来绘制自己(颜色)
    4. 创建某种List(在绘画表面类中)可以容纳您要绘画的对象。在它的paintComponent 中,您将遍历列表并请求每个对象绘制自己,并将Graphics 上下文传递给它。更多详情请关注2D Graphics

    这个previous answer 也可能有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多