我正在使用JPanel(更改其组件),但我想从外部JFrame更改它.
对不起,我用Netbeans制作了这个代码(我知道它放了一些这个问题不需要的东西)并尝试清理编辑它,因为真正的代码它更大
这里是JPanel的代码,名称为“MyPanel”.
public class MyPanel extends javax.swing.JPanel {
private javax.swing.JButton filling = new javax.swing.JButton();
private javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
private javax.swing.JTable myTable = new javax.swing.JTable();
private final javax.swing.table.DefaultTableModel INITIAL_TABLE_MODEL = new javax.swing.table.DefaultTableModel(
new Object[][]{},
new String[]{"Text", "Integer"}
);
public MyPanel() {
initComponents();
//callFilling(); // INNER CALL!
}
private void initComponents() {
filling.setText("filling");
filling.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fillingActionPerformed(evt);
}
});
myTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] { },
new String [] { "Text", "Integer" }
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.Integer.class
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
});
jScrollPane1.setViewportView(myTable);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(filling)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(filling)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE))
);
}
public void callFilling() {
myTable.setModel(INITIAL_TABLE_MODEL);
INITIAL_TABLE_MODEL.setRowCount(0);
((javax.swing.table.DefaultTableModel) myTable.getModel()).setRowCount(0);
Integer numberRows = new java.util.Random().nextInt((10 - 2) + 1) + 2;
for (int i = 0; i < numberRows; i++) {
Integer number = new java.util.Random().nextInt();
((javax.swing.table.DefaultTableModel) myTable.getModel()).addRow(
new Object[]{
number.toString(), number
});
}
this.revalidate();
this.repaint();
}
private void fillingActionPerformed(java.awt.event.ActionEvent evt) {
callFilling();
}
}
框架!!!
public class MainFrame extends javax.swing.JFrame {
private javax.swing.JTabbedPane myTabbed = new javax.swing.JTabbedPane();
public MainFrame() {
initComponents();
MyPanel myPanel = addNewTab();
myPanel.callFilling(); //OUTER CALL!
myPanel.revalidate();
myPanel.repaint();
addNewTab();
}
private MyPanel addNewTab() {
int idx = myTabbed.getTabCount();
String title = "myTabbed: " + idx + " ";
MyPanel myPanel = new MyPanel();
myTabbed.insertTab(title, null, new MyPanel(), null, idx);
return myPanel;
}
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(myTabbed, javax.swing.GroupLayout.DEFAULT_SIZE, 394, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(myTabbed, javax.swing.GroupLayout.DEFAULT_SIZE, 288, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(() -> {
new MainFrame().setVisible(true);
});
}
}
当callFilling();是从JPanel(审查INNER CALL)工作!,但从JFrame(审查//外部调用)不起作用!
回顾这个问题Update content of JPanel on a frame on button click in another frame
建议的revalidate();重绘();我用过的代码,但是没有用.
怎么解决这个?
解决方法:
MyPanel myPanel = addNewTab();
myPanel.callFilling(); //OUTER CALL!
myPanel.revalidate();
myPanel.repaint();
addNewTab();
不确定你要做什么.
您创建一个MyPanel对象并在其上调用callFilling()以设置TableModel中的值.但是你从未真正将面板添加到框架中.
将组件添加到可见面板时,只需要调用revalidate()和repaint().
然后你调用addNewTab(),它执行:
MyPanel myPanel = new MyPanel();
myTabbed.insertTab(title, null, new MyPanel(), null, idx);
return myPanel;
同样,这对于创建2个MyPanel对象没有任何意义.您将一个对象添加到选项卡式窗格,但随后返回第二个MyPanel对象.
所以你创建了3个MyPanel对象.
我真的不确定你要做什么.我不知道您是在尝试向框架添加面板,还是在面板上添加面板,因此我无法真正提出具体建议.
在任何情况下,您都需要构建代码,以便仅在MyObject对象上创建,并且您需要将该面板添加到选项卡式窗格或框架,而不是两者.
标签:java,swing,jpanel,jframe 来源: https://codeday.me/bug/20191003/1847656.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。