高级GUI和图形

时间:2014-04-14 16:16:55

标签: java user-interface methods graphics computer-science

美好的一天,好的,这就是我的问题:我必须通过添加三种不同的类型来创建一个applet GUI组件,以便用户可以从以下选项中进行选择:

  • 数字:1,2,4,8,16或这些的各种组合 编号
  • 数字类型:圆形,椭圆形,矩形或方形
  • 颜色:红色,蓝色,绿色,黄色,粉红色,黑色,青色或品红色

我已完成该设计,但问题是绘制用户选择的图像

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

public class Ovals extends JApplet implements ItemListener
{ 

private JCheckBox circleCB,ovalCB,rectangleCB,squareCB;
private Color currentColor = Color.black;
private JRadioButton redRB, greenRB, blueRB, yellowRB, pinkRB, cyanRB, magentaRB,     blackRB;
private ButtonGroup ColorSelectBGroup;
private JComboBox numFig;

int Figure;
int num;
public String[] figNum = {"1", "2", "4", "8", "16", "32", "64", "128"};

public void init() 
{
    Container c = getContentPane();
        c.setLayout(null);
    circleCB = new JCheckBox("Circle");
    ovalCB = new JCheckBox("Oval");
    rectangleCB = new JCheckBox("Rectangle");
    squareCB = new JCheckBox("Square");
    redRB = new JRadioButton("Red");
    greenRB = new JRadioButton("Green");
    blueRB = new JRadioButton("Blue");
    yellowRB = new JRadioButton("Yellow");
    pinkRB = new JRadioButton("Pink");
    cyanRB = new JRadioButton("Cyan");
    magentaRB = new JRadioButton("Magenta");
    blackRB = new JRadioButton("Black");
    numFig = new JComboBox(figNum);
    numFig.setMaximumRowCount(8);

    circleCB.setSize(80, 30);
    ovalCB.setSize(80, 30);
    rectangleCB.setSize(80, 30);
    squareCB.setSize(80, 30);
    redRB.setSize(80, 30);
    greenRB.setSize(80, 30);   
    blueRB.setSize(80, 30);
    yellowRB.setSize(80, 30);
    pinkRB.setSize(80, 30);
    cyanRB.setSize(80, 30);
    magentaRB.setSize(80, 30);
    blackRB.setSize(80, 30);
    numFig.setSize(80, 30);

    circleCB.setLocation(100, 70);
    ovalCB.setLocation(100, 110);
    rectangleCB.setLocation(100, 150);
    squareCB.setLocation(100, 190);
    redRB.setLocation(300, 70);
    greenRB.setLocation(300, 110);
    blueRB.setLocation(300, 150);
    yellowRB.setLocation(300, 190);
    pinkRB.setLocation(300, 230);
    cyanRB.setLocation(300, 270);
    magentaRB.setLocation(300, 310);
    blackRB.setLocation(300, 350);
    numFig.setLocation(200, 70);

    circleCB.addItemListener(this);
    ovalCB.addItemListener(this);
    rectangleCB.addItemListener(this);
    squareCB.addItemListener((ItemListener) this);
    redRB.addItemListener(this);
    greenRB.addItemListener(this);
    blueRB.addItemListener(this);
    yellowRB.addItemListener(this);
    pinkRB.addItemListener(this);
    cyanRB.addItemListener(this);
    magentaRB.addItemListener(this);
    blackRB.addItemListener(this);
    numFig.addItemListener(this);

    c.add(circleCB);
    c.add(ovalCB);
    c.add(rectangleCB);
    c.add(squareCB);
    c.add(redRB);
    c.add(greenRB);
    c.add(blueRB);
    c.add(yellowRB);
    c.add(pinkRB);
    c.add(cyanRB);
    c.add(magentaRB);
    c.add(blackRB);

    c.add(numFig);

    ColorSelectBGroup = new ButtonGroup();
    ColorSelectBGroup.add(redRB);
    ColorSelectBGroup.add(greenRB);
    ColorSelectBGroup.add(blueRB);
    ColorSelectBGroup.add(yellowRB);
    ColorSelectBGroup.add(pinkRB);
    ColorSelectBGroup.add(cyanRB);
    ColorSelectBGroup.add(magentaRB);
    ColorSelectBGroup.add(blackRB);


}

public void paint (Graphics g)
{
   super.paint(g);
    g.setColor(Color.orange);
    g.drawLine(183, 50, 183, 350);
    g.drawLine(291, 50, 291, 350);

}
public void itemStateChanged(ItemEvent e)
{

    for ( int i = 0; i < 10; i++ )
   {
       switch( Figure ) 
   {
        case e.getSource() == circleCB:
           (e.getStateChange() == ItemEvent.SELECTED)
            e.drawLine( 10, 10, 250, 10 + i * 10 );
        break;
        case e.getSource() == rectangleCB:
            (e.getStateChange() == ItemEvent.SELECTED)
            e.drawRect( 10 + i * 10, 10 + i * 10, 50 + i * 10, 50 + i * 10 );
        break;
        case e.getSource() == ovalCB:
            (e.getStateChange() == ItemEvent.SELECTED)
             e.drawOval( 10 + i * 10, 10 + i * 10, 50 + i * 10, 50 + i * 10 );
        break;
        case e.getSource() == squareCB:
            (e.getStateChange() == ItemEvent.SELECTED)
            e.drawRect( 10 + i * 10, 10 + i * 10, 50 + i * 10, 50 + i * 10 );
        break;
        default:
    }

        if (e.getSource() == redRB)
            currentColor = Color.red;
        else if (e.getSource() == greenRB)
            currentColor = Color.green;
        else if (e.getSource() == blueRB)
            currentColor = Color.blue;
        else if (e.getSource() == yellowRB)
            currentColor = Color.yellow;
        else if (e.getSource() == pinkRB)
            currentColor = Color.pink;
        else if (e.getSource() == cyanRB)
            currentColor = Color.cyan;
        else if (e.getSource() == magentaRB)
            currentColor = Color.magenta;
        else if (e.getSource() == blackRB)
            currentColor = Color.black;

        repaint();
  }
 }
}

我的下一步是什么我必须调整我的itemStateChanged和paint方法,但我不知道如何去做它请帮助

2 个答案:

答案 0 :(得分:1)

建议:

  • 有一个扩展JPanel的类,并使用paintComponent覆盖方法完成所有绘图。
  • 不要忘记在覆盖中调用super方法,通常是第一件事。
  • 然后将此JPanel加载到BorderLayout.CENTER位置的JApplet的contentPane中。
  • 在paintComponent方法中有if块来检查类中变量的状态,例如Color变量,也许是一个数字变量,也许是形状的布尔值,并根据这些变量的状态绘制相应的形状。
  • 在您的监听器中,更改上述变量的状态,然后调用repaint()重新绘制JPanel并显示新形状。

答案 1 :(得分:0)

结帐Custom Painting Approaches。我建议您使用DrawOnComponent示例,因为它允许您将要绘制的对象添加到ArrayList。当前代码使用“ColoredRectangle”类,因此您需要更改它以使用“ColoredShape”类,以便您可以绘制不同形状的对象。

然后你可能想看看Playing With Shapes,它会告诉你如何使用Shape类而不是使用特定的Graphics绘制方法进行绘制。这使您的代码更加灵活。

将两个建议放在一起,你就有了解决方案。