2015-04-30 2 views
1

Итак, я программирую графический интерфейс с использованием java swing, и я использую какой-то старый код, который я использовал для создания движущегося квадрата, но теперь мне нужно использовать кнопки переключения, чтобы некоторые фигуры отображались и исчезали из окна. В моей программе должно быть 4 разных кнопки переключения (у них есть 3 на данный момент), и каждая из них будет иметь конкретную цель: имя отобразит мое имя в центре экрана, прямоугольник отобразит прямоугольник в правом нижнем углу экрана, и овал также покажет овал в правом нижнем углу. Я попытался использовать серию булевых, чтобы определить, какая фигура появляется, но по какой-то причине каждая кнопка будет только переключать прямоугольник, и я не знаю, почему. Есть ли что-то, что я делаю неправильно, что заставляет все кнопки делать то же самое? вот мой код. Во-первых один мой paintPanel:Как я могу заставить каждую из кнопок переключения сделать что-то другое?

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

public class PaintPanel extends JPanel 
{ 
    private static Color[] colors = 
     { Color.RED, Color.BLACK, Color.PINK, Color.ORANGE }; 
    private int colorNumber = 0; 

    private int shape = 0; 

    private int x = 0; 
    private int y = 0; 

    private int width = 100; 
    private int height = 100; 
    private String display = " "; 
    private String none = " "; 

    private int dx = 2; 
    private int dy = 2; 

    private boolean rectangle = true; 
    private boolean oval= true; 
    private boolean Name = true; 
    private boolean special = true; 

    private String displayString = "hello"; 

    private boolean isStarted = true; 

    /*public void update() 
    { 
     if (isStarted) 
     { 
      x += dx; 
      y += dy; 
     } 
     //dx ++; 
     //dy ++; 

     if (y + height > getHeight()) 
     { 
      dy = -Math.abs(dy); 
      shape++; 
      colorNumber = (colorNumber+1)%colors.length; 
     } 
     else if (y < 0) 
     { 
      dy = Math.abs(dy); 
      shape++; 
      colorNumber = (colorNumber+1)%colors.length; 
     } 

     if (x + width > getWidth()) 
     { 
      dx = -Math.abs(dx); 
      shape++; 
      colorNumber = (colorNumber+1)%colors.length; 
     } 
     else if (x < 0) 
     { 
      dx = Math.abs(dx); 
      shape++; 
      colorNumber = (colorNumber+1)%colors.length; 
     } 

    }*/ 
    public void input() 
    { 
     System.out.print("Button"); 
    } 

    public void changeColor() 
    { 
     colorNumber = (colorNumber+1) % colors.length; 
    } 

    /*public void startStop() 
    { 
     //if (isStarted == true) isStarted = false; 
     //else isStarted = true; 

     isStarted = !isStarted; 
    } 
    */ 

    public void setDisplayText(String dt) 
    { 
     displayString = dt; 
    } 


    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     int w = getWidth(); 
     int h = getHeight(); 

     int textx = x+w/2; 
     int texty = y+h/2; 

      FontMetrics fm = g.getFontMetrics(); 
      int texth = fm.getHeight(); 
      int textw = fm.stringWidth(display); 

      textx -= textw/2; 
      texty += texth/2; 
      texty -= 5; 
     if(Name == true) 
     { 
      g.setColor(Color.BLACK); 
      g.drawString(display, textx, texty); 
      Name = false; 
     } 
     else if(Name == false) 
     { 
      g.drawString(none, textx, texty); 
      Name = true; 
     } 
     if (oval == true) 
     { 
      g.setColor(Color.CYAN); 
      g.fillOval((5*w)/8, (5*h)/8, w/4, h/4); 
      oval = false; 
     } 
     else if(oval == false) 
     { 
      g.setColor(Color.WHITE); 
      g.fillOval((5*w)/8, (5*h)/8, w/4, h/4); 
      oval = true; 
     } 
     if(rectangle == true) 
     { 
      g.setColor(Color.PINK); 
      g.fillRect(w/2, h/2, w/2, h/2); 
      rectangle = false; 

     } 
     else if(rectangle == false) 
     { 
      g.setColor(Color.WHITE); 
      g.fillRect(w/2, h/2, w/2, h/2); 
      rectangle = true; 
     } 



     /*int w = getWidth(); 
     int h = getHeight(); 
     g.setColor(colors[colorNumber]); 
     if (shape % 2 == 0) //g.fillOval(x, y, width, height); 
     elseg.fillRect(x,y, width, height); 
     */ 
     /* 
     int textx = x+width/2; 
     int texty = y+height/2; 

     FontMetrics fm = g.getFontMetrics(); 
     int texth = fm.getHeight(); 
     int textw = fm.stringWidth(displayString); 

     textx -= textw/2; 
     texty += texth/2; 
     texty -= 5;  

     g.setColor(colors[(colorNumber+1)%colors.length]); 
     g.drawString(displayString, textx, texty); 
     */ 
    } 

} 

Независимо закомментирована потому, что она будет реализована позже специальной кнопки. А вот мой основной класс:

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

public class GuiTest extends JFrame 
    implements ActionListener 
{ 
    private Timer frameTimer; 
    private JToggleButton Name; 
    private JToggleButton oval; 
    private JToggleButton rectangle; 
    //private JTextField theText; 
    private PaintPanel paintPanel; 

    public GuiTest() 
    { 
     setTitle("Servando Hernandez"); 
     setSize(500,500); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel topPanel = new JPanel(); 
     topPanel.setLayout(new GridLayout(1,4)); 

     Name = new JToggleButton("Name"); 
     Name.addActionListener(this); 

     oval = new JToggleButton("Oval"); 
     oval.addActionListener(this); 

     rectangle = new JToggleButton("Rectangle"); 
     rectangle.addActionListener(this); 

     //theText = new JTextField("HI"); 
     //theText.addActionListener(this); 


     topPanel.add(Name); 
     topPanel.add(oval); 
     topPanel.add(rectangle); 
     //topPanel.add(theText); 

     Container contentPane = getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 
     contentPane.add(topPanel, BorderLayout.SOUTH); 

     paintPanel = new PaintPanel(); 
     contentPane.add(paintPanel, BorderLayout.CENTER); 

     //frameTimer = new Timer(50, this); 
     //frameTimer.start(); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     //System.out.println("Action performed"); 
     if (e.getSource() == oval)  
     { 
      paintPanel.input(); 
     } 
     /*else if (e.getSource() == frameTimer) 
     { 
      paintPanel.update(); 
     }*/ 
     if (e.getSource() == rectangle) 
     { 
      paintPanel.input(); 
     } 
     if (e.getSource() == oval) 
     { 
      //System.out.println("start/stop"); 
      paintPanel.input(); 
     } 
     if (e.getSource() == Name) 
     { 
      paintPanel.input(); 
      String text = e.getActionCommand(); 
      paintPanel.setDisplayText("Servando Hernandez"); 
      //System.out.println(text); 
     } 

     repaint(); 
    } 

    public static void main(String[] args) 
    { 
     GuiTest gui = new GuiTest(); 
     gui.setVisible(true); 

    } 
} 

ответ

3

Независимо закомментирована потому, что она будет реализована позже специальной кнопки.

Ну, не включайте код в вопрос. Код не имеет отношения к вопросу, и мы не хотим тратить время на чтение или угадать, почему он есть?

private boolean Name = true; 

Почему имя переменной капитализируется? Ни одна из других переменных не начинается с капитала (что верно). Быть последовательным!!!

if(Name == true) 
    { 
     g.setColor(Color.BLACK); 
     g.drawString(display, textx, texty); 
     Name = false; 
    } 
    else if(Name == false) 
    { 
     g.drawString(none, textx, texty); 
     Name = true; 
    } 

Вы делаете оператор if сложным. Если логическая переменная не истинна, то она ложна. Просто используйте:

if(name == true) 
    //if(name) // even simpler, you don't need the "== true" 
    { 
     g.setColor(Color.BLACK); 
     g.drawString(display, textx, texty); 
    } 
    else 
    { 
     g.drawString(none, textx, texty); 
    } 

Я не понимаю ваш код ActionListener. Неважно, какая кнопка вы нажимаете, вы всегда выполняете paintPanel.input().

См. Ниже, например, код.

Упорядочить код, используя эти предложения. Если вам по-прежнему нужна дополнительная помощь, разместите надлежащий номер SSCCE, который демонстрирует проблему.

Edit:

Вы должны добавить свойства к классу PaintPanel. Например:

public void setOval(Boolean oval) 
{ 
    this.oval = oval; 
    repaint(); 
} 

Теперь в ActionListener ваш код будет:

if (e.getSource() == oval) 
{ 
    paintPanel.setOval(oval.isSelected(); 
} 
+0

Спасибо, я был довольно безрассудно с мой код, так как это мой первый раз возиться с графическим интерфейсом. Но я смущен. В исправлении вы указываете oval == true, но что это будет делать? Я имею в виду, что кнопка переключения не может использоваться как логическая. – Servanh

+0

@Servanh, Это опечатка, я хочу сказать 'oval = true'. Однако, сделав второй взгляд, это неверно. Взгляните на редактирование на мой ответ. – camickr

+0

Теперь я понимаю. Это мне очень поможет. Большое спасибо за редактирование. – Servanh

2

Существует много непонятных вещей в вашем коде. Для начала вы включаете/выключаете состояние всех ваших фигур каждый раз, когда запускается ваш paintComponent(). Вы должны обращаться с состоянием из вашего метода actionPerformed(). Например:

if (e.getSource() == rectangle) { 
    // paintPanel.input(); // what's this doing anyways? 
    paintPanel.setShowRectangle(rectangle.isSelected()); 
} 

В любом случае, ваши другие формы не показываются по разным причинам ...

Вашего display является пустой строкой. Попробуйте это и посмотрите:

g.drawString("Test", textx, texty); 

Вы позиционируете его с панели. Я изменил его (5 к 1) просто, чтобы сделать вид, но вы, вероятно, хотите, чтобы это где-нибудь еще:

g.fillOval((1 * w)/8, (1 * h)/8, w/4, h/4); 
+0

1+, слишком много проблем, чтобы следить за ними все ... – camickr