0

我需要一个 GUI,它应该有两行两列 [第一列带有标签,第二列带有文本字段]。我已经编写了下面的代码,但我无法将其放入列和行中。请您帮忙将其放入列和行中。

 public void showstate(){

       MyPanel b=new MyPanel();
       f.setBounds(50, 50, 800, 600);
       f.add(b);
       b.updateState(result);
       f.setVisible(true);
       System.out.println("Number of times AC is on:" + AcCounter);
       System.out.println("Number of times Heater is on:" + HeaterCounter);


}

class MyPanel extends JPanel {

    /**
 * 
 */
private static final long serialVersionUID = 1L;
    private JTextField t;
    private JTextField v;


    public MyPanel() {
    //setBorder(BorderFactory.createLineBorder(Color.black));


    JLabel l = new JLabel("THE STATUS OF AC IS");


    this.add(l);
    t = new JTextField("<html><table><tr><td></td><td></td></tr><br></br></table></html>");

    this.add(t);
    //JLabel l = new JLabel("");  
   l.setBounds(100, 100, 30, 30);

    JLabel p = new JLabel("THE STATUS OF HEATER IS");


    p.setAlignmentX(LEFT_ALIGNMENT);
    p.setHorizontalAlignment(30);
    p.setBounds(100, 200, 30, 30);
    this.add(p);
    v = new JTextField("<td></td></tr></table></html>");

    this.add(v);



  // JLabel m = new JLabel("<html> <span><br><br><br>Accounter</br></br></br></span>    </html> ",JLabel.CENTER);


  //m.setBounds(100, 300, 30, 30);

 // JLabel n = new JLabel("<html> <span><br><br><br>Heatercounter</br></br></br></span></html> ", JLabel.CENTER);

    //n.setBounds(100, 400, 30, 30);


    t.setBounds(300, 400, 30, 50);

  //  q = new JTextField("");
  //  w = new JTextField("");

   // this.add(m);
 //   this.add(q);
   // this.add(n);
 //   this.add(w);

}

public void updateState(String result) {

    String ac, ab;
   //     double AcIsOn,HeaterIsOn;

    if ("aboveHt".equals(result) || "coolAir".equals(result)) {
        ac = "cooler on";
        AcCounter++;
    } else {
        ac = "cooler off";
    }


     if(temperature==72){ 
        ab = "Heater off";
    }
     else  if ("belowHt".equals(result)) {
         ab = "Heater on";
         HeaterCounter++;
        // AcCounter=1;
     }
    else {
        ab = "Heater off";
    }                                               
      t.setText(ac);
     v.setText(ab);

}        
}

我在一行中得到输出为Ac JTextField 的状态 Heater JTextField的状态

4

3 回答 3

3

在 Swing 中布局事物的正确方法是使用布局管理器。您的面板具有 FlowLayout 的默认布局,它将所有组件放在一行中,就像您正在观察的那样。

您可以使用 GridLayout 或 BoxLayout 的组合或更复杂的东西。查看布局管理器的教程以做出选择。

于 2013-11-05T22:09:22.877 回答
1

我建议您阅读有关LayoutManager 的内容。它可以帮助您构建您的 GUI。

这是GridLayout1 列有 2 个标签和 2 列 2 字段的示例:

public class Example extends JFrame {

public Example() {
    setLayout(new GridLayout(2,2));
    JLabel l1 = new JLabel("l1");
    JLabel l2 = new JLabel("l2");
    JTextField f1 = new JTextField();
    JTextField f2 = new JTextField();

    add(l1);
    add(f1);
    add(l2);
    add(f2);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setVisible(true);
}

public static void main(String...strings ){
    Example e = new Example();
}

}
于 2013-11-05T22:10:52.993 回答
1

您可以通过多种方式实现这一目标。

如前所述,您应该在使用 Swing 时利用适当的布局管理器,Swing API 是围绕它们设计的(或考虑到它们)。

另一种方法是使用JTable

在此处输入图像描述

注意事项:这是一个非常简单的示例,并假设一个单行表。就个人而言,我更喜欢允许多行,但这得到了基本的想法......

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;

public class TestTable {

    public static void main(String[] args) {
        new TestTable();
    }

    public TestTable() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                MonitorTableModel model = new MonitorTableModel();
                model.setAcStatus("Off");
                model.setHeaterStatus("On");

                JTable table = new JTable(model);
                JScrollPane scrollPane = new JScrollPane(table);                

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(scrollPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MonitorTableModel extends AbstractTableModel {

        private String acStatus;
        private String heaterStatus;

        public void setAcStatus(String acStatus) {
            this.acStatus = acStatus;
            fireTableCellUpdated(1, 0);
        }

        public void setHeaterStatus(String heaterStatus) {
            this.heaterStatus = heaterStatus;
            fireTableCellUpdated(1, 1);
        }

        @Override
        public int getRowCount() {
            return 1;
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return String.class;
        }

        @Override
        public String getColumnName(int column) {
            return column == 0 ? "AC Status" : "Heater Status";
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return columnIndex == 0 ? acStatus : heaterStatus;
        }

    }        
}

查看如何使用表格了解更多详情

于 2013-11-05T23:05:50.863 回答