如何在java中为Jpanel添加3个矩形?

时间:2014-10-31 21:44:50

标签: java layout jframe jpanel paint

我正在尝试将三个矩形添加到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);
}

}

这是我的布局,我想要中心的矩形。 sample output

2 个答案:

答案 0 :(得分:1)

  1. 不要覆盖paint,在Swing中绘画是通过一系列复杂而复杂的方法实现的,这些方法很容易被破坏。相反,改为覆盖它的paintComponent方法。有关详细信息,请参阅Painting in AWT and Swing
  2. 话虽如此,不要将所有组件添加到要绘制的同一个面板上,否则最终会在所有组件下绘制。相反,创建一个单独的JPanel作为绘画表面,另一个JPanel作为控制器(包含控件和绘画表面)。使用setter和getter来更改绘制表面的状态。有关详细信息,请参阅Performing Custom Painting
  3. 创建某种“可绘制”对象,它知道如何绘制自己以及绘制自身应该使用什么(颜色)
  4. 创建某种List(在绘画表面类中),它可以容纳您想要绘制的对象。在其中paintComponent,您将循环遍历列表并请求每个对象绘制自身,并将Graphics上下文传递给它。有关详细信息,请查看2D Graphics
  5. previous answer也可以提供帮助

答案 1 :(得分: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();
    }

}

这就是它的样子:

enter image description here