JTable尺寸问题

我遇到了JTables的问题我知道我的代码有点难以理解,它也有点混乱,因为它来自一个相当大的程序。 是的,我刚刚了解了java命名约定,其中不使用大写字母启动变量。

final JFrame Menu = new JFrame("Crime Database 2013"); Dimension screenSize0 = Menu.getToolkit().getScreenSize(); Menu.setBounds(screenSize0.width / 4, screenSize0.height / 4, screenSize0.width / 2, screenSize0.height / 2); Menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Menu.setVisible(true); JPanel options = new JPanel(new GridBagLayout()); GridBagConstraints a = new GridBagConstraints(); Menu.add(options); JButton show = new JButton("Show all records"); a.gridx = 0; a.gridy = 1; options.add(show, a); final JFrame Show = new JFrame("Crime Database 2013 - Show Records"); Dimension screenSize3 = Show.getToolkit().getScreenSize(); Show.setBounds(screenSize3.width/3 - 250, screenSize3.height/7, screenSize3.width - 150, screenSize3.height-200); Show.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Show.setLayout(new GridBagLayout()); GridBagConstraints g = new GridBagConstraints(); final JPanel data = new JPanel(new FlowLayout()); JPanel sortselect = new JPanel(new GridBagLayout()); GridBagConstraints h = new GridBagConstraints(); g.gridx = 0; g.gridy = 2; Show.add(sortselect, g); g.gridx = 0; g.gridy = 0; g.gridheight = 2; g.gridwidth = 5; Show.add(data, g); JLabel label = new JLabel("Sort options"); JRadioButton none = new JRadioButton("No Sort",true); JLabel frname = new JLabel("By First Name"); JRadioButton frnameup = new JRadioButton("First name - Alphabetical"); JRadioButton frnamedn = new JRadioButton("First name - Reverse-Alphabetical"); JLabel lsname = new JLabel("By Last Name"); JRadioButton lsnameup = new JRadioButton("Last name - Alphabetical"); JRadioButton lsnamedn = new JRadioButton("Last name - Reverse-Alphabetical"); JLabel byage = new JLabel("By Age"); JRadioButton ageup = new JRadioButton("Age - Increasing"); JRadioButton agedn = new JRadioButton("Age - Decreasing"); JLabel bycrime = new JLabel("By Crime"); JRadioButton crimeup = new JRadioButton("Crime - Alhabetically"); JRadioButton crimedn = new JRadioButton("Crime - Reverse-Alphabetical"); JLabel year = new JLabel("By Year of release"); JRadioButton yearup = new JRadioButton("Expected Year of Release - First"); JRadioButton yeardn = new JRadioButton("Expected Year of Release - Last"); ButtonGroup sortgroup = new ButtonGroup(); sortgroup.add(none); sortgroup.add(frnameup); sortgroup.add(frnamedn); sortgroup.add(lsnameup); sortgroup.add(lsnamedn); sortgroup.add(ageup); sortgroup.add(agedn); sortgroup.add(crimeup); sortgroup.add(crimedn); sortgroup.add(yearup); sortgroup.add(yeardn); h.insets = new Insets(10,10,10,10); h.gridx = 0; h.gridy = 2; sortselect.add(frname, h); h.gridx = 0; h.gridy = 3; sortselect.add(frnameup, h); h.gridx = 0; h.gridy = 4; sortselect.add(frnamedn, h); h.gridx = 1; h.gridy = 2; sortselect.add(lsname, h); h.gridx = 1; h.gridy = 3; sortselect.add(lsnameup, h); h.gridx = 1; h.gridy = 4; sortselect.add(lsnamedn, h); h.gridx = 2; h.gridy = 2; sortselect.add(byage, h); h.gridx = 2; h.gridy = 3; sortselect.add(ageup, h); h.gridx = 2; h.gridy = 4; sortselect.add(agedn, h); h.gridx = 3; h.gridy = 2; sortselect.add(bycrime, h); h.gridx = 3; h.gridy = 3; sortselect.add(crimeup, h); h.gridx = 3; h.gridy = 4; sortselect.add(crimedn, h); h.gridx = 4; h.gridy = 2; sortselect.add(year, h); h.gridx = 4; h.gridy = 3; sortselect.add(yearup, h); h.gridx = 4; h.gridy = 4; sortselect.add(yeardn, h); h.gridwidth = 5; h.gridheight = 1; h.gridx = 0; h.gridy =0; sortselect.add(label, h); h.gridx = 0; h.gridy = 1; sortselect.add(none, h); show.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e1) { Menu.setVisible(false); int entries = 0; BufferedReader lines = null; try { lines = new BufferedReader(new FileReader("L:\\workspace\\new java\\sources\\c-database.txt")); } catch (FileNotFoundException e) { e.printStackTrace(); } try { while (lines.readLine() != null) { entries++; } } catch (IOException e2) { e2.printStackTrace(); } BufferedReader crimeinfo = null; try { crimeinfo = new BufferedReader(new FileReader("L:\\workspace\\new java\\sources\\c-database.txt")); } catch (FileNotFoundException e) { e.printStackTrace(); } String namelist[] = new String[entries]; String agelist[] = new String[entries] ; String crimelist[] = new String[entries]; String release[] = new String[entries]; for (int i = 0; i < entries; i++) { String full = null; try { full = crimeinfo.readLine(); } catch (IOException e) { e.printStackTrace(); } String split[] = full.split(","); namelist[i] = split[0]; agelist[i] = split[1]; crimelist[i] = split[2]; release[i] = split[3]; } String firstnamelist[] = new String[entries]; String lastnamelist[] = new String[entries]; for (int i = 0; i < entries; i++) { String namesplit[] = namelist[i].split(" "); firstnamelist[i] = namesplit[0]; lastnamelist[i] = namesplit[1]; } final String[] headers = {"First Name", "Last Name", "Age", "Crime committed", "Expected Year of Release" }; final String[][] crimedata = new String[entries][5]; for (int i = 0; i < entries; i++) { crimedata[i][0] = firstnamelist[i]; crimedata[i][1] = lastnamelist[i]; crimedata[i][2] = agelist[i]; crimedata[i][3] = crimelist[i]; crimedata[i][4] = release[i]; }; for (int i = 0; i < entries; i++) { for (int j = 0; j < 5; j++) { System.out.println(headers[j]); System.out.println(crimedata[i][j]); } } final JTable crimetable = new JTable(crimedata, headers); JScrollPane scrollpane = new JScrollPane(crimetable); crimetable.setAutoCreateRowSorter(true); data.add(scrollpane); Show.setVisible(true); } } ); 

我把这段代码放到了eclipse中,然后把所有的单选按钮取出来,然后就开始了。 虽然我不确定为什么

  1. JTable无法返回正确的DimensionPreferredSize ,有三种方法

  2. table.setPreferredScrollableViewportSize(table.getPreferredSize()); 但是注意到有一些行和列的小JTable

  3. 计算列的(部分)和(部分)行的所需大小,然后在表格中传递此Dimension table.setPreferredScrollableViewportSize(new Dimension(x, y));

  4. 覆盖JScrollPane getPreferredSize

  5. 然后JFrame.pack(before JFrame.setVisible(true))在屏幕上计算所需的大小

  6. JPanel在API中实现了FlowLayout ,我建议更改为BorderLayout,然后CENTER区域中的JScrollPane可以填充整个(可用)区域,并且可以使用JFrame重新resize,不能调整由FlowLayout生成的JComponent(连同其容器)的大小

  7. 必须调用data.revalidate()data.repaint()Show.pack()作为最后的代码行而不是(删除此代码行)Show.setVisible(true);

  8. Show重命名为myFrameshowmyButton

setPreferredScrollableViewportSize到底做了什么? 它只是强制表总是那么大吗? 什么是整包装?

getPreferredScrollableViewportSize()方法在Scrollable接口中定义,在实现滚动 – 精明客户端中讨论。 您可以覆盖getPreferredScrollableViewportSize()来更改默认值,而不是设置首选大小。 这里说明了高度是getRowHeight()的倍数。 有关首选尺寸的更多信息,请点击此处 。 方便地, pack()方法“使此Window大小适合其子组件的首选大小和布局。”