java - java Jtable JscrollPane 全屏显示的JTable
问题描述
我的 JTable 和滚动条有问题,我尝试了几件事,现在只有当框架处于全屏高度时才可以,请参见下面的屏幕截图:
我试图实现这一目标:
Dimension dim = new Dimension(400,350);
tableProd.setSize(dim);
tableProd.setPreferredSize(dim);
tableProd.setMinimumSize(dim);
tableProd.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tableProd.setModel(modeleDatas);
tableProd.setPreferredScrollableViewportSize(dim);
JScrollPane scrollTab=new JScrollPane(tableProd);
scrollTab.setPreferredSize(dim);
panelProd.add(scrollTab, gbc);
甚至用这个 JSTable 扩展 JTable :
public class JSTable extends JTable {
/**
* Returns false to indicate that horizontal scrollbars are required
* to display the table while honoring perferred column widths. Returns
* true if the table can be displayed in viewport without horizontal
* scrollbars.
*
* @return true if an auto-resizing mode is enabled
* and the viewport width is larger than the table's
* preferred size, otherwise return false.
* @see Scrollable#getScrollableTracksViewportWidth
*/
public boolean getScrollableTracksViewportWidth() {
if (autoResizeMode != AUTO_RESIZE_OFF) {
if (getParent() instanceof JViewport) {
return (((JViewport)getParent()).getWidth() > getPreferredSize().width);
}
}
return false;
}
}
用户界面代码:
public class Fenetre extends JFrame {
私有 JPanel 面板 = new JPanel(new CardLayout());
public Fenetre(){
this.setTitle("Gestion Station Phone");
this.setSize(900, 800);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initMenu();
this.setJMenuBar(menuBar);
GridBagConstraints gbcPage = new GridBagConstraints();
cardBD.setLayout(new GridBagLayout());
titrePage.setFont(new Font("Serif",Font.BOLD,22));
gbcPage.gridx=0;
gbcPage.gridy=0;
gbcPage.gridwidth=3;
cardBD.add(titrePage,gbcPage);
GridBagConstraints gbc = new GridBagConstraints();
panelActions.setLayout(new GridBagLayout());
gbc.gridx = 0;
gbc.gridy = 0;
panelActions.add(buttonAdd,gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.insets=new Insets(10,0,0,0);
panelActions.add(buttonUpdate,gbc);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.insets=new Insets(10,0,0,0);
panelActions.add(buttonDel,gbc);
gbcPage.gridx=0;
gbcPage.gridy=1;
Border border = new LineBorder(Color.BLACK);
Border margin = new EmptyBorder(10,10,10,10);
panelActions.setBorder(new CompoundBorder(border,margin));
panelActions.setBackground(Color.white);
gbcPage.gridwidth=1;
gbcPage.insets=new Insets(10,0,0,0);
cardBD.add(panelActions,gbcPage);
panelInfosRow.setLayout(new GridBagLayout());
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets=new Insets(0,0,0,0);
labelId.setText("ID");
panelInfosRow.add(labelId,gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.insets=new Insets(2,0,0,0);
textId.setPreferredSize(new Dimension(80,20));
panelInfosRow.add(textId,gbc);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.insets=new Insets(15,0,0,0);
panelInfosRow.add(label1,gbc);
gbc.gridx = 0;
gbc.gridy = 3;
gbc.insets=new Insets(2,0,0,0);
text1.setPreferredSize(new Dimension(120,20));
panelInfosRow.add(text1,gbc);
gbc.gridx = 0;
gbc.gridy = 3;
gbc.insets=new Insets(2,0,0,0);
combo.setVisible(false);
panelInfosRow.add(combo,gbc);
.....
gbcPage.gridx=1;
gbcPage.gridy=1;
gbcPage.gridwidth=1;
gbcPage.insets=new Insets(10,20,0,0);
cardBD.add(panelInfosRow,gbcPage);
panelProd.setLayout(new GridBagLayout());
Dimension dim = new Dimension(400,350);
tableProd.setSize(dim);
tableProd.setPreferredSize(dim);
tableProd.setMinimumSize(dim);
tableProd.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tableProd.setModel(modeleDatas);
tableProd.setPreferredScrollableViewportSize(dim);
gbc.gridx = 0;
gbc.gridy = 0;
panelProd.add(labelProd, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
JScrollPane scrollTab=new JScrollPane(tableProd);
scrollTab.setPreferredSize(dim);
panelProd.add(scrollTab, gbc);
gbcPage.gridx=2;
gbcPage.gridy=1;
gbcPage.gridwidth=1;
cardBD.add(panelProd,gbcPage);
logo = new JLabel(new ImageIcon("images/logo_station_phone2.png"));
cardHome.setLayout(new GridBagLayout());
gbc.gridx = 0;
gbc.gridy = 0;
cardHome.add(logo,gbc);
gbc.insets = new Insets(10,0,0,0);
gbc.gridx = 0;
gbc.gridy = 1;
cardHome.add(new JLabel("Choix point de vente "),gbc);
gbc.insets = new Insets(2,0,0,0);
gbc.gridx = 0;
gbc.gridy = 2;
MagasinDAO magasinBDD = new MagasinDAO(daoFactory);
Object[][] magasins = magasinBDD.trouverMagasins();
choix_magasin.addItem(new ObjectIdValue(-1, ""));
if(prefs.getLong("id_point",-1)==-1)
choix_magasin.setSelectedIndex(0);
for(int i= 0 ; i<magasins.length;i++){
choix_magasin.addItem(new ObjectIdValue((long) magasins[i][0], (String) magasins[i][1]));
if(prefs.getLong("id_point",-1)==(long) magasins[i][0])
choix_magasin.setSelectedIndex(i+1);
}
choix_magasin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
prefs.putLong("id_point", ((ObjectIdValue)choix_magasin.getSelectedItem()).getId());
}
});
cardHome.add(choix_magasin,gbc);
cardVente.setLayout(new GridBagLayout());
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth=2;
cardVente.add(labelVente, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth=2;
gbc.insets = new Insets(8,0,0,0);
listModel = new DefaultTableModel();
liste_prod_vente.setModel(listModel);
cardVente.add(liste_prod_vente, gbc);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.insets = new Insets(8,0,0,0);
gbc.gridwidth=2;
cardVente.add(label_vente_client,gbc);
gbc.gridx = 0;
gbc.gridy = 3;
gbc.insets = new Insets(2,0,0,0);
gbc.gridwidth=2;
cardVente.add(liste_client,gbc);
panels.add(cardHome,BorderLayout.CENTER);
panels.add(cardBD,BorderLayout.CENTER);
panels.add(cardVente, BorderLayout.CENTER);
cardHome.setVisible(true);
cardBD.setVisible(false);
cardBD.setVisible(false);
所以,我不知道是什么问题如此奇怪。我正在等待解决方案谢谢。
解决方案
您需要正确配置包含 (又包含您的 )的父容器的布局管理器。从线JScrollPane
JTable
panelProd.add(scrollTab, gbc);
在您的第一个代码片段中,我猜父容器是panelProd
并且它的布局管理器是GridBagLayout
. 因此,您需要正确配置与滚动窗格关联的GridBagConstraints
实例(我猜是)。gbc
你可能需要类似的东西
gbc.fill = GridBagConstraint.BOTH;
gbc.weightx = 1;
gbc.weighty = 1;
panelProd.add(scrollTab, gbc);
在这种情况下,不要为滚动窗格和表格设置首选尺寸!!
但是,如果不知道填充的其余代码,panelProd
则无法确定。
编辑以反映原始问题中的其他源代码:
替换行中的代码
panelProd.setLayout(new GridBagLayout());
到线
cardBD.add(panelProd,gbcPage);
和
JPanel panelProd = new JPanel(new BorderLayout());
tableProd.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tableProd.setModel(modeleDatas);
panelProd.add(labelProd, BorderLayout.NORTH);
JScrollPane scrollTab=new JScrollPane(tableProd);
panelProd.add(scrollTab, BorderLayout.CENTER);
int oldFill = gbcPage.fill;
double oldWeightX = gbcPage.weightx;
double oldWeightY = gbcPage.weighty;
gbcPage.fill = GridBagConstraints.BOTH;
gbcPage.gridx=2;
gbcPage.gridy=1;
gbcPage.gridwidth=1;
gbcPage.weightx=1;
gbcPage.weighty=1;
cardBD.add(panelProd,gbcPage);
gbc.fill = oldFill;
gbc.weightx = oldWeightX;
gbc.weighty = oldWeightY;
GridBagLayout
对于像您这样的简单安排来说不是必需的prodPanel
(BorderLayout
在这种情况下使用起来就足够了并且更简单)。
推荐阅读
- javascript - 有没有办法扭转atan的影响?
- php - 按月份和年份排序,2015-09 之后是 2016-01 而不是 2015-10
- android - 菜单复选框上的多项选择
- asp.net-web-api2 - 使用 Web API 2、ASP.NET 4.7,使用其令牌服务或 IdentityServer,尤其是在考虑刷新令牌时?
- php - 使用 $this 关键字初始化 php 静态变量
- azure - 使用 ADF Web 活动启动/停止 Azure Function App
- c# - 如何在C#中知道excel表中输入文本的数据类型
- python - 首先按特定行排序
- ios - 在 Xcode 中打开我的 React Native 项目,我的代码在哪里?
- android - 在哪里销毁数据库实例:Activity onDestroy() 或 ViewModel onCleared()?