【问题标题】:JTable not showing up on JFrame (Java)JTable 未显示在 JFrame (Java) 上
【发布时间】:2017-07-20 02:48:37
【问题描述】:

JFrame 没有显示添加到其中的JTable,我遇到了问题。我试过getContentPane().add(..),我已经切换到只是添加以使代码更短一点。任何帮助都非常感谢!

package com.embah.Accgui;

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

public class accCreator extends JFrame {
private String[] columnNames = {"Username", "Password", "Members", "World"};
private Object[][] data = {{"b", "b", "b", "b"},
                          { "e", "e", "e", "e"}};
    private JTable tbl_Accounts;
    private JScrollPane scrollPane;
    private JLabel lbl_Account = new JLabel();
    private JLabel lbl_Username = new JLabel();
    private JLabel lbl_Password = new JLabel();
    private JLabel lbl_Homeworld = new JLabel();
    private JButton btn_Select = new JButton();
    private JButton btn_Addacc = new JButton();
    private JButton btn_Delacc = new JButton();
    private JTextArea txt_Username = new JTextArea();
    private JTextArea txt_Password = new JTextArea();
    private JTextArea txt_Homeworld = new JTextArea();
    private JCheckBox cbox_Members = new JCheckBox();
    private JCheckBox cbox_RanWrld = new JCheckBox();


public accCreator() {
    setLayout(null);
    setupGUI();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

void setupGUI() {
    tbl_Accounts = new JTable(data, columnNames);
    tbl_Accounts.setLocation(5, 30);
    tbl_Accounts.setPreferredScrollableViewportSize(new Dimension(420, 250));
    tbl_Accounts.setFillsViewportHeight(true);
    tbl_Accounts.setVisible(true);
    add(tbl_Accounts);
    scrollPane = new JScrollPane(tbl_Accounts);
    add(scrollPane);

    lbl_Account.setLocation(4, 5);
    lbl_Account.setSize(100, 20);
    lbl_Account.setText("Select Account:");
    add(lbl_Account);

    lbl_Username.setLocation(5, 285);
    lbl_Username.setSize(70, 20);
    lbl_Username.setText("Username:");
    add(lbl_Username);

    lbl_Password.setLocation(5, 310);
    lbl_Password.setSize(70, 20);
    lbl_Password.setText("Password:");
    add(lbl_Password);

    lbl_Homeworld.setLocation(310, 310);
    lbl_Homeworld.setSize(80, 20);
    lbl_Homeworld.setText("Home World:");
    add(lbl_Homeworld);

    btn_Select.setLocation(305, 5);
    btn_Select.setSize(120, 20);
    btn_Select.setText("Select Account");
    add(btn_Select);

    btn_Addacc.setLocation(300, 285);
    btn_Addacc.setSize(60, 20);
    btn_Addacc.setText("Add");
    btn_Addacc.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent arg0) {
            String worldSel = "";
            if(cbox_RanWrld.isSelected()){
                worldSel = "Random";
            } else {
                worldSel = txt_Homeworld.getText();
            }
            Object[] row = {txt_Username.getText(), txt_Password.getText(), cbox_Members.isSelected(), worldSel};
            DefaultTableModel model = (DefaultTableModel) tbl_Accounts.getModel();
            model.addRow(row);
        }
    });
    add(btn_Addacc);

    btn_Delacc.setLocation(365, 285);
    btn_Delacc.setSize(60, 20);
    btn_Delacc.setText("Del");
    btn_Delacc.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent arg0) {
            DefaultTableModel model = (DefaultTableModel) tbl_Accounts.getModel();

        }
    });
    add(btn_Delacc);

    txt_Username.setLocation(80, 285);
    txt_Username.setSize(100, 20);
    txt_Username.setText("");
    txt_Username.setRows(5);
    txt_Username.setColumns(5);
    add(txt_Username);

    txt_Password.setLocation(80, 310);
    txt_Password.setSize(100, 20);
    txt_Password.setText("");
    txt_Password.setRows(5);
    txt_Password.setColumns(5);
    txt_Password.setTabSize(0);
    add(txt_Password);

    txt_Homeworld.setLocation(395, 310);
    txt_Homeworld.setSize(30, 20);
    txt_Homeworld.setText("82");
    txt_Homeworld.setRows(5);
    txt_Homeworld.setColumns(5);
    txt_Homeworld.setTabSize(0);
    add(txt_Homeworld);

    cbox_Members.setLocation(185, 285);
    cbox_Members.setSize(80, 20);
    cbox_Members.setText("Members");
    cbox_Members.setSelected(false);
    add(cbox_Members);

    cbox_RanWrld.setLocation(185, 310);
    cbox_RanWrld.setSize(115, 20);
    cbox_RanWrld.setText("Random World");
    cbox_RanWrld.setSelected(false);
    add(cbox_RanWrld);

    setTitle("Account Manager");
    setSize(440, 370);
    setVisible(true);
    setResizable(false);

}

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

【问题讨论】:

  • 好吧,setLayout(null); 将是你的问题的开始 - 表格也倾向于被包裹在 JScrollPanes 中
  • 您忘记致电scrollPane.setLocation(...)scrollPane.setSize(...)。这是必需的,因为您决定使用setLayout(null)。我希望您现在明白避免使用 LayoutManager 是一个错误的决定。
  • @MadProgrammer - 我知道这不是问题,因为其他一切都很好。 @Thomas 让你试试,谢谢!
  • 仍然无法让它为滚动窗格添加大小和位置。
  • @Kushroom 坦率地说,这只是你问题的开始——但这是你的选择

标签: java swing jframe jtable


【解决方案1】:

我知道这不是问题,因为其他一切都很好

哦……真的吗?不在我的电脑里...

让我们在我的 PC 中显示您的实际 GUI:

GUI 在您的计算机上看起来是否相同?我打赌没有。

但是...为什么在我的电脑上看起来像这样?

好吧,正如上面@MadProgrammer 在 cmets 中所述,这是因为setLayout(null); 行。您可能想阅读Why is it frowned upon to use a null layout in Java Swing? 了解更多信息。

现在,话虽如此,您还应该想阅读并学习如何使用各种layout managers 来创建复杂的 GUI。

在您的代码中,您从未设置 scrollPane 的位置/边界及其大小,因此组件的默认大小为 0、0。

但是...我认为最好向您展示如何获得一个非常相似的 GUI(我很着急,所以我没有制作一个更相似的 GUI)。您可以复制粘贴我的代码并查看相同的输出(可能因操作系统而略有不同),但不会裁剪文本。

产生上图的代码是这个:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class AccountCreator {

    private JFrame frame;
    private JPanel mainPane;
    private JPanel topPane;
    private JPanel tablePane;
    private JPanel bottomPane;

    private JLabel selectAccountLabel;
    private JLabel userNameLabel;
    private JLabel passwordLabel;
    private JLabel homeWorldLabel;

    private JTextField userNameField;
    private JTextField homeWorldField;
    private JPasswordField passwordField;

    private JCheckBox membersBox;
    private JCheckBox randomBox;

    private JButton selectAccountButton;
    private JButton addButton;
    private JButton deleteButton;

    private JTable table;

    private JScrollPane scroll;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new AccountCreator().createAndShowGui();
            }
        });
    }

    public void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());

        int rows = 30;
        int cols = 3;

        String[][] data = new String[rows][cols];

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                data[i][j] = i + "-" + j;
            }
        }

        String[] columnNames = { "Column1", "Column2", "Column3" };

        table = new JTable(data, columnNames);

        scroll = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        table.setPreferredScrollableViewportSize(new Dimension(420, 250));
        table.setFillsViewportHeight(true); 

        selectAccountLabel = new JLabel("Select Account");
        userNameLabel = new JLabel("Username: ");
        passwordLabel = new JLabel("Password: ");
        homeWorldLabel = new JLabel("Home world");

        selectAccountButton = new JButton("Select Account");
        addButton = new JButton("Add");
        deleteButton = new JButton("Del");

        userNameField = new JTextField(10);
        passwordField = new JPasswordField(10);
        homeWorldField = new JTextField(3);

        membersBox = new JCheckBox("Members");
        randomBox = new JCheckBox("Random world");

        topPane = new JPanel();
        topPane.setLayout(new BorderLayout());

        topPane.add(selectAccountLabel, BorderLayout.WEST);
        topPane.add(selectAccountButton, BorderLayout.EAST);

        tablePane = new JPanel();
        tablePane.add(scroll);

        bottomPane = new JPanel();
        bottomPane.setLayout(new GridLayout(0, 5, 3, 3));

        bottomPane.add(userNameLabel);
        bottomPane.add(userNameField);
        bottomPane.add(membersBox);
        bottomPane.add(addButton);
        bottomPane.add(deleteButton);
        bottomPane.add(passwordLabel);
        bottomPane.add(passwordField);
        bottomPane.add(randomBox);
        bottomPane.add(homeWorldLabel);
        bottomPane.add(homeWorldField);
        
        mainPane = new JPanel();
        mainPane.setLayout(new BoxLayout(mainPane, BoxLayout.PAGE_AXIS));
        
        frame.add(topPane, BorderLayout.NORTH);
        frame.add(tablePane, BorderLayout.CENTER);
        frame.add(bottomPane, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

另外,您可能已经注意到main() 方法不同,嗯,它里面的代码将程序放在Event Dispatch Thread (EDT) 上。

因此,请务必将其包含在您未来的计划中

【讨论】:

  • "所以组件的首选大小为 0, 0。)" - 实际上它可能具有首选大小,只是没有物理大小(或默认大小为0x0)
  • 不能说谢谢你们,对不起,我之前这么固执地听你们的话。我只是想制作一个漂亮的 GUI,我花了一整天的时间试图让它工作,我非常沮丧。 Frak 你向我展示了 setLayout(null) 非常糟糕,不应该这样做。我非常感谢你们的意见和帮助!我非常感谢你们的帖子!
  • @Kushroom 不用担心 :) 我很高兴它有帮助 ^^
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 2020-10-28
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 2014-10-02
相关资源
最近更新 更多