【问题标题】:JTable Properly aligning inside JScrollPaneJTable 在 JScrollPane 内正确对齐
【发布时间】:2016-04-28 03:00:31
【问题描述】:

我在JScrollView 内有一个JTable 但它似乎并没有很好地对齐滚动条很小我猜这是因为alignment.Moreover 这是一个sn- p 来自真实代码:

    JFrame frame = new JFrame();
    frame.setResizable(false);
    frame.setBounds(100, 100, 771, 453);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    JPanel panel = new JPanel();
    panel.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));
    panel.setBounds(10, 32, 747, 370);
    frame.getContentPane().add(panel);
    panel.setLayout(null);

    JPanel VPanel = new JPanel();
    VPanel.setBounds(297, 43, 440, 224);
    panel.add(VPanel);

    JTable TableV = new JTable();
    TableV.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    TableV.getTableHeader().setReorderingAllowed(false);
    DefaultTableModel Model = new DefaultTableModel(0, 0);
    String header[] = new String[] { "Country", "ID", "WAN IP", "User", "OS", "Java version" };

    VPanel.add(new JScrollPane(TableV, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));

    // just adding some data to fill the table
    Model.setColumnIdentifiers(header);
    //set model into the table object
    TableV.setModel(Model);

     //just adding some diff data to check if it scrolls down
     for (int count = 1; count <= 50; count++)
     {
        Model.addRow(new Object[] { "data1", "data2", "data3", "data4", "data5", "data6" });
     }

     for (int count = 1; count <= 70; count++)
     {
        Model.addRow(new Object[] { "data100", "data200", "data300", "data400", "data500", "data600" });
     }

     frame.setVisible(true);

【问题讨论】:

  • 您对空布局和setBounds 的使用现在或以后都会把您搞得一团糟,您会想摆脱新手这样做的习惯。学习布局管理器,然后使用布局管理器。
  • 了解 VPanel(应重命名为 vPanel 以符合 Java 命名规则)使用 FlowLayout,因此滚动窗格可能不适合其中。如果您希望滚动窗格填充它,请给它一个 BorderLayout 并添加 JScrollPane BorderLayout.CENTER。
  • 如果您需要更严格的帮助,请告诉我们更多关于正在发生的事情,因为"it is not aligning well" 有点含糊。考虑张贴一张你正在看到的和你想看到的图片。最后创建并发布您的minimal reproducible example,以便我们自己实际运行您的代码。
  • 感谢@HovercraftFullOfEels 刚刚编辑到 JPanel VictimPanel = new JPanel(new BorderLayout());并修复它谢谢,将了解有关布局管理器的更多信息,是的,我确实知道命名不遵循约定会起作用,我只是喜欢它的外观,这就是为什么我大多以这种方式编码但从现在开始会改变它谢谢
  • 正如你所说的 BorderLayout 问题@HovercraftFullOfEels,你能知道这样可以将其标记为答案吗?

标签: java swing jtable jscrollpane


【解决方案1】:

了解 VPanel(应重命名为 vPanel 以符合 Java 命名规则)使用 FlowLayout,因此滚动窗格可能不适合其中。如果您希望滚动窗格填充它,请给它一个 BorderLayout 并添加 JScrollPane BorderLayout.CENTER。

例如,

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")
public class TableFoo extends JPanel {
    private static final String[] HEADER = new String[] { "Country", "ID", "WAN IP", "User", "OS", "Java version" };
    private static final int PREF_W = 500;
    private static final int PREF_H = 400;
    private DefaultTableModel model = new DefaultTableModel(HEADER, 0);
    private JTable table = new JTable(model);

    public TableFoo() {
        for (int count = 0; count < 50; count++) {
            model.addRow(new Object[] { "data1", "data2", "data3", "data4", "data5", "data6" });
        }

        for (int count = 0; count < 70; count++) {
            model.addRow(new Object[] { "data100", "data200", "data300", "data400", "data500", "data600" });
        }

        JScrollPane scrollPane = new JScrollPane(table);

        setLayout(new BorderLayout());
        add(scrollPane, BorderLayout.CENTER);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("TableFoo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new TableFoo());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

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

【讨论】:

  • 感谢@Hovercraft Full Of Eels 的示例
猜你喜欢
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
相关资源
最近更新 更多