Java 实现GUI
我需要一个GUI,它应该有两行两列[第一列带有标签,第二列带有文本字段]。我已经写了下面的代码,但我无法将其放入列和行中。请您帮助将其放入列和行中Java 实现GUI,java,swing,awt,Java,Swing,Awt,我需要一个GUI,它应该有两行两列[第一列带有标签,第二列带有文本字段]。我已经写了下面的代码,但我无法将其放入列和行中。请您帮助将其放入列和行中 public void showstate(){ MyPanel b=new MyPanel(); f.setBounds(50, 50, 800, 600); f.add(b); b.updateState(result); f.setVisible(true);
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);
}
}
public void showstate(){
MyPanel b=新的MyPanel();
f、 立根(50,50800600);
f、 添加(b);
b、 (结果);
f、 setVisible(真);
System.out.println(“AC开启的次数:“+AcCounter”);
System.out.println(“加热器打开的次数:“+加热器计数器”);
}
类MyPanel扩展了JPanel{
/**
*
*/
私有静态最终长serialVersionUID=1L;
私有jtext字段;
私人JTextField v;
公共事务委员会(){
//setboorder(BorderFactory.createLineBorder(Color.black));
JLabel=新的JLabel(“AC的状态为”);
本条增补(l);
t=新的JTextField(“
”);
本条增补(t);
//JLabel=新的JLabel(“”);
l、 立根(100,100,30,30);
JLabel p=新JLabel(“加热器状态为”);
p、 setAlignmentX(左对齐);
p、 设置水平对齐(30);
p、 立根(100,200,30,30);
本条增补(p);
v=新的JTextField(“”);
本条增补(v);
//JLabel m=新JLabel(
会计人员”,JLabel.CENTER);
//m、 立根(100,300,30,30);
//JLabel n=新JLabel(
加热器计数器”,JLabel.CENTER);
//n、 立根(100400,30,30);
t、 立根(300,400,30,50);
//q=新的JTextField(“”);
//w=新的JTextField(“”);
//本条增补(m);
//本条增补(q);
//本条增补(n);
//本条增补(w);
}
public void updateState(字符串结果){
串ac,ab;
//双阿西森;
如果(“高于HT”。等于(结果)| |“冷却空气”。等于(结果)){
ac=“冷却器打开”;
AcCounter++;
}否则{
ac=“冷却器关闭”;
}
如果(温度==72){
ab=“加热器关闭”;
}
else if(“belowHt.”等于(结果)){
ab=“加热器打开”;
加热器计数器++;
//AcCounter=1;
}
否则{
ab=“加热器关闭”;
}
t、 setText(ac);
v、 setText(ab);
}
}
我得到的输出是Ac的状态JTextField加热器的状态JTextField在一行中正确的布局方式是使用布局管理器。您的面板有一个默认布局FlowLayout,它将所有组件放在一行中,就像您正在观察的一样
您可以使用GridLayout或BoxLayout的组合或更复杂的东西。查看以做出选择。在Swing中布局事物的正确方法是使用布局管理器。您的面板有一个默认布局FlowLayout,它将所有组件放在一行中,就像您正在观察的一样
您可以使用GridLayout或BoxLayout的组合或更复杂的东西。查看以做出选择。我建议您阅读有关它的内容,它可以帮助您构建GUI 下面是一个示例,其中
GridLayout
1列有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();
}
}
我建议您阅读有关它帮助您构建GUI的内容 下面是一个示例,其中
GridLayout
1列有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();
}
}
有很多方法可以实现这一点 如前所述,在使用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;
}
}
}
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.table.AbstractTableModel;
公共类测试表{
公共静态void main(字符串[]args){
新的TestTable();
}
公共测试表(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
MonitorTableModel模型=新的MonitorTableModel();
型号:setAcStatus(“关闭”);
型号:setHeaterStatus(“On”);
JTable table=新的JTable(模型);
JScrollPane scrollPane=新的JScrollPane(表);
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(滚动窗格);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类MonitorTableModel扩展了AbstractTableModel{
私有字符串状态;
私有字符串加热器状态;
public void setAcStatus(字符串acStatus){
this.acStatus=acStatus;
FireTableCell更新(1,0);
}
公共无效setHeaterStatus(字符串heaterStatus){
this.heaterStatus=heaterStatus;
FireTableCell更新(1,1);
}
@凌驾
public int getRowCount(){
返回1;
}
@凌驾
public int getColumnCount(){
返回2;
}
@凌驾
公共类getColumnClass(int columnIndex){
返回字符串.class;
}
@凌驾