2014-10-31 22 views
0

我想添加三个矩形到BorderLayout的中心,我完全失去了。我完成的程序需要在滑块移动时增加矩形的高度,但我试图弄清楚如何将这三个矩形绘制到jpanel中。我很迷茫。我的代码如下。如何在java中为Jpanel添加3个矩形?

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

回答

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

编辑: 其实,我猜你真的不需要一个“画布”类,你可以使用一个简单的JPanel作为@MadProgrammer建议。你需要的是一个封装了矩形行为的类,它只是一个简单的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

+0

所以使用这个类,我创建画布对象主,并将其添加到jpanel? – user3242607 2014-10-31 22:02:05

+0

是的,这是一般的想法。 – helmy 2014-10-31 22:05:19

+0

@ user3242607不,'Canvas'和'JPanel'不喜欢一起玩,最终会出现绘画工件和z顺序问题。你不应该混合沉重的(AWT)和光(Swing)组件,这是不值得的。如果您要开始向当前的'JPanel'添加组件,那么为什么您需要自定义绘画? – MadProgrammer 2014-11-01 00:56:04

1
  1. 不要覆盖paint,画在Swing是由方法一个微妙而复杂的链条,这是很容易折断实现。相反,重写它的paintComponent方法。请参阅Painting in AWT and Swing以了解更多详细信息
  2. 话虽如此,不要将所有组件添加到要绘制到的同一个面板中,最终将绘制所有组件。相反,创建一个单独的JPanel作为油漆表面和另一个作为控制器(包含控件和油漆表面)的JPanel。使用setters和getters来改变油漆表面的状态。有关更多详细信息,请参阅Performing Custom Painting
  3. 创建某种“绘制”对象,它知道如何绘制自己以及它应该用油漆本身(颜色)的
  4. 创建某种List(在车漆表面类),可容纳的对象你想绘画。在它的paintComponent中,您将循环访问列表并请求每个对象绘制自己,并将其传递给Graphics上下文。看看2D Graphics更多细节

previous answer还可以帮助