2013-12-09 2 views
-2

Я работаю с Java уже около года и только что освоил интерфейс GUI. Я пишу программу, которая будет вычислять центр масс между 2, 3, 4 или 5 точками (опция пользователя). В зависимости от количества точек, которые пользователь хочет ввести, появляется ряд редактируемых JTextFields для ввода координат и масс этих координат. К сожалению, когда его просят вычислить центр масс, кнопка не отобразит то, что я хочу. То, как это написано сейчас, - единственный способ, которым я получил его для компиляции/запуска без пустой строковой ошибки. Я полагаю, что это связано с тем, как я инициализировал переменные /, где они инициализируются между конструкторами, но я не могу на всю жизнь выяснить, где именно эта проблема. Любая помощь будет оценена! Я прикрепил код - я знаю, что он длинный, но вы никогда не знаете, что может быть полезно. Благодаря!Пустой прослушиватель кнопок

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

public class ComboBox extends JFrame 
/*************VARIABLES*******************************************************/ 
{ 
    private final int WIDTH = 1500; 
    private final int HEIGHT = 1500; 
    private JPanel northPanel; 
    private JPanel centerPanel; 

private JPanel blankPanel; 
private JPanel pointsPanel; 
private JPanel selectedPointsPanel; 
private JComboBox pointsBox; 
private JTextField selectedPoints; 
private JLabel selection; 
private String choose = "Choose an option..."; 
private String twoPoints = "2 points"; 
private String threePoints = "3 points"; 
private String fourPoints = "4 points"; 
private String fivePoints = "5 points"; 
private String[] points = {choose, twoPoints, threePoints, fourPoints, fivePoints}; 

private JPanel coordinatesPanel; 
private JPanel cPanel; 
private JTextField xField1; 
private JTextField xField2; 
private JTextField xField3; 
private JTextField xField4; 
private JTextField xField5; 
private JTextField yField1; 
private JTextField yField2; 
private JTextField yField3; 
private JTextField yField4; 
private JTextField yField5; 
private JLabel instructions; 
private JLabel X; 
private JLabel Y; 
private JLabel blankLabel; 

private JPanel massPanel; 
private JTextField mass1 = new JTextField(10); 
private JTextField mass2 = new JTextField(10); 
private JTextField mass3 = new JTextField(10); 
private JTextField mass4 = new JTextField(10); 
private JTextField mass5 = new JTextField(10); 
private JLabel instructions2; 

Boolean calcBool = false; 
private JButton calcButton = new JButton("Calculate"); 
private JButton resetButton = new JButton("Reset"); 

private JPanel displayPanel; 
private double centerX; 
private double centerY; 
private JLabel display; 

private double x1, x2, x3, x4, x5; 
private double y1, y2, y3, y4, y5; 
private double m1, m2, m3, m4, m5; 


/**********************************WINDOW************************************/ 
public ComboBox() 
{ 
    super("Choose an option"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(new GridLayout(3,2)); 
    setLocationRelativeTo(null); 
    setResizable(true); 
    setSize(WIDTH, HEIGHT); 

    buildPointsPanel(); 
    buildCoordinatesPanel(); 
    buildMassPanel(); 
    buildDisplayPanel(); 
    buildBlankPanel(); 

    add(pointsPanel); 
    add(coordinatesPanel); 
    add(massPanel); 
    add(blankPanel); 
    add(calcButton); 
    add(blankPanel); 
    add(resetButton); 
    add(blankPanel); 
    add(displayPanel); 

    calcButton.addActionListener(new CalcButtonListener()); 
    pointsBox.addActionListener(new ComboBoxListener()); 
    //resetButton.addActionListener(new ResetButtonListener()); 

    pack(); 
    setVisible(true); 

}

/************************BUILD ALL THE PANELS**********************/ 
private void buildBlankPanel() 
{ 
    blankPanel = new JPanel(); 
} 
private void buildPointsPanel() 
{ 
    pointsPanel = new JPanel(); 
    pointsPanel.setLayout(new GridLayout(3,1)); 
    pointsBox = new JComboBox(points); 
    pointsBox.addActionListener(new ComboBoxListener()); 
    pointsPanel.add(pointsBox); 
    selection = new JLabel("You selected: "); 
    selectedPoints = new JTextField(10); 
    selectedPoints.setEditable(false); 
    pointsPanel.add(selection); 
    pointsPanel.add(selectedPoints); 
} 

private void buildCoordinatesPanel() 
{ 
    coordinatesPanel = new JPanel(); 
    coordinatesPanel.setLayout(new GridLayout(6,2)); 
    instructions = new JLabel("Please enter the X and Y values of your points below."); 
    JLabel blank = new JLabel(""); 
    X = new JLabel("X values"); 
    Y = new JLabel("Y values"); 
    blankLabel = new JLabel(""); 

    coordinatesPanel.add(instructions); 
    coordinatesPanel.add(blankLabel); 
    coordinatesPanel.add(X); 
    coordinatesPanel.add(Y); 

    xField1 = new JTextField(10); 
    xField1.setEditable(true); 
    yField1 = new JTextField(10); 
    yField1.setEditable(true); 
    xField2 = new JTextField(10); 
    xField2.setEditable(true); 
    yField2 = new JTextField(10); 
    yField2.setEditable(true); 
    xField3 = new JTextField(10); 
    xField3.setEditable(true); 
    yField3 = new JTextField(10); 
    yField3.setEditable(true); 
    xField4 = new JTextField(10); 
    xField4.setEditable(true); 
    yField4 = new JTextField(10); 
    yField4.setEditable(true); 
    xField5 = new JTextField(10); 
    xField5.setEditable(true); 
    yField5 = new JTextField(10); 
    yField5.setEditable(true); 
} 

private void buildMassPanel() 
{ 
    massPanel = new JPanel(); 
    instructions2 = new JLabel("Please enter the masses of your points"); 
    massPanel.add(instructions2); 
    mass1.setEditable(true); 
    mass2.setEditable(true); 
    mass3.setEditable(true); 
    mass4.setEditable(true); 
    mass5.setEditable(true); 
} 

private void buildDisplayPanel() 
{ 
    displayPanel = new JPanel(); 
    //display = new JLabel("The center of mass is located at (" + centerX + "," + centerY 
    +")."); 
    //displayPanel.add(display); 
} 

/********************************COMBOBOX LISTENER****************************/  
private class ComboBoxListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { //The following asks the user to select the number of points they want and stores 
     it 
    String select =(String) pointsBox.getSelectedItem(); 
    selectedPoints.setText(select); 

    //The following determines how many text fields to display depending on how many  
    points the user wants 

    if (select==twoPoints) 
    { 
     coordinatesPanel.add(xField1); 
     coordinatesPanel.add(yField1); 
     coordinatesPanel.add(xField2); 
     coordinatesPanel.add(yField2); 

     massPanel.add(mass1); 
     massPanel.add(mass2); 

centerX = ((m1*x1)+(m2*x2)/(m1+m2)); 
     centerY = ((m1*y1)+(m2*y2)/(m1+m2)); 
     } 
    if (select==threePoints) 
    { 
     coordinatesPanel.add(xField1); 
     coordinatesPanel.add(yField1); 
     coordinatesPanel.add(xField2); 
     coordinatesPanel.add(yField2); 
     coordinatesPanel.add(xField3); 
     coordinatesPanel.add(yField3); 

     massPanel.add(mass1); 
     massPanel.add(mass2); 
     massPanel.add(mass3); 

    centerX = ((m1*x1)+(m2*x2)+(m3*x3)/(m1+m2+m3)); 
     centerY = ((m1*y1)+(m2*y2)+(m3*y3)/(m1+m2+m3)); 
    } 
    if (select==fourPoints) 
    { 
     coordinatesPanel.add(xField1); 
     coordinatesPanel.add(yField1); 
     coordinatesPanel.add(xField2); 
     coordinatesPanel.add(yField2); 
     coordinatesPanel.add(xField3); 
     coordinatesPanel.add(yField3); 
     coordinatesPanel.add(xField4); 
     coordinatesPanel.add(yField4); 

     massPanel.add(mass1); 
     massPanel.add(mass2); 
     massPanel.add(mass3); 
     massPanel.add(mass4); 

    centerX = ((m1*x1)+(m2*x2)+(m3*x3)+(m4*x4)/(m1+m2+m3+m4)); 
     centerY = ((m1*y1)+(m2*y2)+(m3*y3)+(m4*y4)/(m1+m2+m3+m4)); 
     } 
    if (select==fivePoints) 
    { 
     coordinatesPanel.add(xField1); 
     coordinatesPanel.add(yField1); 
     coordinatesPanel.add(xField2); 
     coordinatesPanel.add(yField2); 
     coordinatesPanel.add(xField3); 
     coordinatesPanel.add(yField3); 
     coordinatesPanel.add(xField4); 
     coordinatesPanel.add(yField4); 
     coordinatesPanel.add(xField5); 
     coordinatesPanel.add(yField5); 

     massPanel.add(mass1); 
     massPanel.add(mass2); 
     massPanel.add(mass3); 
     massPanel.add(mass4); 
     massPanel.add(mass5); 

    centerX = ((m1*x1)+(m2*x2)+(m3*x3)+(m4*x4)+(m5*x5)/(m1+m2+m3+m4+m5)); 
     centerY = ((m1*y1)+(m2*y2)+(m3*y3)+(m4*y4)+(m5*y5)/(m1+m2+m3+m4+m5)); 
    } 
    if (select==choose) 
    { 
     JOptionPane.showMessageDialog(null, "Please select a valid option"); 
    } 
    } 
} 
/********************************CALC BUTTON LISTENER******************************/ 
private class CalcButtonListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
    display = new JLabel("The center of mass is located at (" + centerX + "," + centerY 
    +")."); 
displayPanel.add(display); 
    }  

} 
/******************************MAIN METHOD***************************/  
public static void main(String[] args) 
{ 
    new ComboBox(); 
} 
+0

Пожалуйста, разместите только соответствующие части вашего кода. И какой результат вы получаете? – Lestat

ответ

0

Что вы должны сделать, это создать экземпляр display, где вы его объявили.

JLabel display = new JLabel(" "); 

Затем добавьте его в графический интерфейс, где бы в коде не добавлялись все остальные компоненты. Чем в классе слушателя, просто установить текст

public void actionPerformed(ActionEvent e){ 
    display.setText("some text"); 
} 

Путь вы делаете это может испортить нужное форматирование GUI. Если вам нужно это сделать, вам необходимо добавить revalidate() и repaint() после добавления новых компонентов. Я бы рекомендовал использовать первый.

0

Не знаете, где ваша конкретная проблема, но, глядя на ваш код, я вижу некоторые возможные ошибки. В java вы сравниваете равенство объектов с equals() не с ==. == предназначен для ссылок.

Так меняет все строки, в которых вы сравниваете строки с ==, замените на equals.

Для примера изменения

select==fivePoints в

select.equals(fivePoints) 

, имеющие признаки как

private JTextField mass1 = new JTextField(10); 
private JTextField mass2 = new JTextField(10); 
private JTextField mass3 = new JTextField(10); 
private JTextField mass4 = new JTextField(10); 
private JTextField mass5 = new JTextField(10); 

не лучшим образом, вы можете хранить их в Collection или в массиве.

private List<JTextField> masses; 

Всегда при добавлении компонента вызова revalidate и repaint.

display = new JLabel("The center of mass is located at (" + centerX + "," + centerY 
    +")."); 
displayPanel.add(display); 
displayPanel.revalidate(); 
displayPanel.repaint(); 
Смежные вопросы