Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 难以调整JTable的大小_Java_Swing - Fatal编程技术网

Java 难以调整JTable的大小

Java 难以调整JTable的大小,java,swing,Java,Swing,我很难调整我的JTable的大小,我尝试将左列设置为一个设定的宽度,同时让右列填充表的其余部分,左列的宽度将发生变化,但它扩展了它的容器(并因此切断了一些数据)如下图: (不支持图像类型??) 正如您所看到的,“我们”从User这个词中被切掉 这是我试图调整它的大小,所有这些都绝对没有效果 setBounds(any, any, any, any) -- No effect setMaximumSize(new Dimension(any, any)); --- No effect 然后我在面

我很难调整我的JTable的大小,我尝试将左列设置为一个设定的宽度,同时让右列填充表的其余部分,左列的宽度将发生变化,但它扩展了它的容器(并因此切断了一些数据)如下图:

(不支持图像类型??)

正如您所看到的,“我们”从
User
这个词中被切掉

这是我试图调整它的大小,所有这些都绝对没有效果

setBounds(any, any, any, any) -- No effect
setMaximumSize(new Dimension(any, any)); --- No effect
然后我在面板中尝试了一些廉价的黑客,它是一个孩子:

childPanel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
int index = Utils.getComponentIndex((childPanel.add(friendsList)));
childPanel.getComponent(index).setBounds(any, any, any, any);
这也没有效果

最让我困扰的是setBounds()不起作用,因为这正是我所用的一切(空布局,第一个jframe应用程序,我喜欢使用像素位置来处理一切)

代码如下:(扩展JPanel

当然,friendslist.java(扩展了JTable

知道如何更改好友列表的大小吗?(扩展JTable)


注意:我已经从friendslist中删除了所有的“大小”代码,因为我想给出一个“干净”的解决方案,即使没有设置边界,它仍然是相同大小的。这就像试图手动设置大小完全没有意义一样。

这是一个基本示例,说明了如何使用布局管理器生成类似的布局。此示例使用
BorderLayout
FlowLayout
gridbagloayout

它还显示了如何生成固定宽度的列;)


this.setLayout(null)-第一个错误;java(扩展JTable)——第二个错误。几乎没有理由从
JTable
扩展。我从JTable扩展的原因是,在右键单击时发出选择,并根据行值创建弹出菜单。使用适当的布局管理器,将
JTable
添加到
JScrollPane
,将
JScrollPane
放到您的
SocialPanel
什么是基于“绝对”布局的“适当布局管理器”?我希望一切都由像素位置来定义,我遇到的唯一解决方案是使用(null),所以当字体度量、DPI或其他渲染管道发生变化时,您的“完美像素”布局会在您的脸上爆炸吗?避免使用
null
布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计宗旨是与布局经理一起工作,放弃这些将导致无止境的问题,您将花费越来越多的时间来纠正这些问题。谢谢,我将开始将所有内容转移到这种布局样式,您不知道它有多大帮助。这只是一个“可能”的解决方案,但是应该给您一些如何将复杂布局组合在一起的想法;)
public SocialPanel() {
    this.setLayout(null);
    this.setBounds(650, 0, 150, 400);
    this.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));


    friendsList = new FriendsList();
    ignoreList = new IgnoreList();

    JLabel title = new JLabel("Social Pane");
    title.setBounds(45, 3, 75, 25);

    childPanel = new JPanel();
    childPanel.setBounds(0, 30, 150, 325);
    childPanel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
    childPanel.add(friendsList);

    JButton showFriends = new JButton("F");
    showFriends.setBounds(15, 360, 50, 30);

    JButton showIgnore = new JButton("I");
    showIgnore.setBounds(80, 360, 50, 30);


    this.add(title);    
    this.add(childPanel);
    this.add(showFriends);
    this.add(showIgnore);
}
public FriendsList() {
    this.setGridColor(Color.gray);
    this.setShowGrid(true);
    this.setDefaultRenderer(Object.class, new SocialCellRenderer());
    this.setMaximumSize(new Dimension(1, 1));
    DefaultTableModel dtm = (DefaultTableModel)getModel();
    dtm.addColumn("Username");
    dtm.addColumn("Status");

    getColumn("Username").setMinWidth(115);
    getColumn("Username").setMaxWidth(115);
    setRowHeight(20);

    addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            if(SwingUtilities.isRightMouseButton(e)) {
                JTable source = (JTable)e.getSource();
                int row = source.rowAtPoint(e.getPoint());
                int column = source.columnAtPoint(e.getPoint());
                if(!source.isRowSelected(row))
                    source.changeSelection(row, column, false, false);
                buildPopup(row, e.getX(), e.getY());
            }
        }
    });
}
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

public class TestLayout {

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

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

                JPanel content = new JPanel() {
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(200, 200);
                    }
                };

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(content);
                frame.add(new FriendsPanel(), BorderLayout.EAST);
                frame.add(new MessagePane(), BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class FriendsPanel extends JPanel {

        public FriendsPanel() {
            setLayout(new BorderLayout());
            JLabel header = new JLabel("Social Pane");
            header.setBorder(new CompoundBorder(new EtchedBorder(), new EmptyBorder(8, 8, 8, 8)));
            add(header, BorderLayout.NORTH);

            DefaultTableModel model = new DefaultTableModel();
            model.addColumn("");
            model.addColumn("");

            model.addRow(new Object[]{"er3107", "Offline"});
            model.addRow(new Object[]{"er4360", "Online"});
            model.addRow(new Object[]{"er187", "Offline"});
            model.addRow(new Object[]{"er1040", "Online"});
            model.addRow(new Object[]{"er427", "Online"});
            model.addRow(new Object[]{"er4140", "Online"});
            model.addRow(new Object[]{"er835", "Offline"});
            model.addRow(new Object[]{"er2045", "Online"});
            model.addRow(new Object[]{"er4525", "Online"});
            model.addRow(new Object[]{"er4864", "Offline"});

            JTable table = new JTable(model);
            table.setPreferredScrollableViewportSize(new Dimension(100, 200));
            table.setFillsViewportHeight(true);

            Font font = table.getFont();
            FontMetrics fm = table.getFontMetrics(font);

            TableColumnModel cm = table.getColumnModel();
            TableColumn column = cm.getColumn(0);
            int width = fm.stringWidth("M") * 8;
            column.setWidth(width);
            column.setMaxWidth(width);
            column.setMinWidth(width);
            column.setPreferredWidth(width);

            column = cm.getColumn(1);
            column.setPreferredWidth(width);

            add(new JScrollPane(table));

            JButton btnF = new JButton("F");
            JButton btnI = new JButton("I");

            JPanel buttons = new JPanel();
            buttons.setBorder(new CompoundBorder(new EtchedBorder(), new EmptyBorder(8, 8, 8, 8)));
            buttons.add(btnF);
            buttons.add(btnI);
            add(buttons, BorderLayout.SOUTH);
        }

    }

    public class MessagePane extends JPanel {

        public MessagePane() {
            setLayout(new BorderLayout());

            DefaultTableModel model = new DefaultTableModel();
            model.addColumn("");
            model.addColumn("");
            model.addColumn("");

            model.addRow(new Object[]{"rank", "user4916", "..."});
            model.addRow(new Object[]{"rank", "user2916", "..."});
            model.addRow(new Object[]{"rank", "user4471", "..."});
            model.addRow(new Object[]{"rank", "user4161", "..."});
            model.addRow(new Object[]{"rank", "user2048", "..."});
            model.addRow(new Object[]{"rank", "user3212", "..."});
            model.addRow(new Object[]{"Admin", "Chris", "Testing..."});

            JTable table = new JTable(model);
            table.setFillsViewportHeight(true);

            Font font = table.getFont();
            FontMetrics fm = table.getFontMetrics(font);

            table.setPreferredScrollableViewportSize(new Dimension(200, fm.getHeight() * 9));

            TableColumnModel cm = table.getColumnModel();
            TableColumn column = cm.getColumn(0);
            int width = fm.stringWidth("M") * 6;
            column.setWidth(width);
            column.setMaxWidth(width);
            column.setMinWidth(width);
            column.setPreferredWidth(width);

            width = fm.stringWidth("M") * 10;
            column = cm.getColumn(1);
            column.setWidth(width);
            column.setMaxWidth(width);
            column.setMinWidth(width);
            column.setPreferredWidth(width);

            add(new JScrollPane(table));

            JPanel buttons = new JPanel(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            buttons.add(new JTextField(5), gbc);
            gbc.gridx++;
            gbc.weightx = 0;
            buttons.add(new JButton("Send Chat"), gbc);
            add(buttons, BorderLayout.SOUTH);
        }

    }

}