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