Java Swing:看不到扩展 JPanel 的 class 组件
Java Swing: Can't see components of class that extends JPanel
我创建了这个扩展 JPanel 的 class JPanelCaso:
public class JPanelCaso extends JPanel implements MouseListener{
JCheckBox checkBox;
JTextArea textArea;
String frasePerCliente = "";
private int distanzaDaBordi = 0;
private int distanzaCheckTextA = 5;
private SpringLayout layoutPnlCaso = new SpringLayout();
/**
* Costruttore della classe Caso
*
* @param checkBox l' oggetto di tipo JCheckBox relativo al caso
* @param textArea l' oggetto di tipo JtextArea relativo al caso
*/
JPanelCaso(String strTitoloCaso, String frasePerCliente){
this.addMouseListener(this);
checkBox = new JCheckBox();
checkBox.addMouseListener(this);
textArea = new JTextArea(strTitoloCaso);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.addMouseListener(this);
textArea.setEditable(false);
this.frasePerCliente = frasePerCliente;
componiPannello();
}
private void componiPannello() {
this.setLayout(layoutPnlCaso);
//Dispongo i controlli
layoutPnlCaso.putConstraint(SpringLayout.WEST, checkBox, distanzaDaBordi, SpringLayout.WEST, this);
layoutPnlCaso.putConstraint(SpringLayout.EAST, checkBox, -distanzaCheckTextA, SpringLayout.WEST, textArea);
layoutPnlCaso.putConstraint(SpringLayout.WEST, textArea, -distanzaDaBordi, SpringLayout.WEST, this);
layoutPnlCaso.putConstraint(SpringLayout.NORTH, checkBox, distanzaDaBordi, SpringLayout.NORTH, this);
layoutPnlCaso.putConstraint(SpringLayout.NORTH, textArea, distanzaDaBordi, SpringLayout.NORTH, this);
layoutPnlCaso.putConstraint(SpringLayout.SOUTH, textArea, distanzaDaBordi, SpringLayout.SOUTH, this);
this.add(checkBox);
this.add(textArea);
}
}
然后我在一个 JPanel 中插入各种 JPanelCaso,这是另一个 JPanel 的卡片布局:
public class GuidaBpoEse{
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new GuidaBpoEse();
}
});
}
public GuidaBpoEse() {
creaFinestraMain();
}
Workbook wbDbCommentiEse = null;
Dimension grandezzaSchermo = Toolkit.getDefaultToolkit().getScreenSize();
int larghezzaMain = (int)(grandezzaSchermo.getWidth() * 0.20);
int altezzaMain = (int)(grandezzaSchermo.getHeight() * 0.95);
Point inizioMain = new Point((int)grandezzaSchermo.getWidth() - larghezzaMain, 0);
JFrame frmMain = new JFrame();
int nFogli;
int iFoglio = 0;
int righe; //conta le righe del iFoglio fino all' ultima piena
int colonne; //conta le colonne del iFoglio fino all' ultima piena
int riga;
int colonna;
int distanzaTraCasi = 5;
int distanzaDaBordi = 0;
static JTextArea txtaFrasiTrovate;
private void creaFinestraMain() {
try {
wbDbCommentiEse = Workbook.getWorkbook(new File("db.xls"));
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
nFogli = wbDbCommentiEse.getNumberOfSheets();
...
SpringLayout layoutMain = new SpringLayout();
JPanel pnlMain = new JPanel(layoutMain);
...
// Pannello della scelta delle macrocasistiche ==================================================
JPanel pnlMacrocasistiche = new JPanel(new GridLayout(nFogli - 2, 1));
JScrollPane spnlMacrocasistiche = null;
JButton[] btnMacrocasistiche = new JButton[nFogli]; //Salterò il primo elemento per far corrispondere l' indice dei fogli nel file excel con l' indice dei fogli nell' array di tasti
Sheet sAppoggio;
iFoglio++;
while (iFoglio < nFogli - 1) {
iFoglio++;
sAppoggio = wbDbCommentiEse.getSheet(iFoglio);
btnMacrocasistiche[iFoglio] = new JButton(sAppoggio.getName());
pnlMacrocasistiche.add(btnMacrocasistiche[iFoglio]);
btnMacrocasistiche[iFoglio].addMouseListener(new MouseListener() {
@Override
public void mouseEntered(MouseEvent arg0) {
JButton btnAppoggio = (JButton)arg0.getSource();
layoutPnlDettagli.show(pnlDettagli, btnAppoggio.getText());
frmDettagli.setVisible(true);
}
...
});
}
spnlMacrocasistiche = new JScrollPane(pnlMacrocasistiche);
spnlMacrocasistiche.setBorder(BorderFactory.createTitledBorder("Macrocasistiche"));
pnlMain.add(spnlMacrocasistiche);
// ==============================================================================================
//Posiziono spnlMacrocasistiche
spnlMacrocasistiche.setPreferredSize(new Dimension((int)frmMain.getWidth(), (int)(frmMain.getHeight() * 0.4)));;
layoutMain.putConstraint(SpringLayout.NORTH, spnlMacrocasistiche, distanzaDaBordi, SpringLayout.SOUTH, pnlDatiCliente);
layoutMain.putConstraint(SpringLayout.WEST, spnlMacrocasistiche, distanzaDaBordi, SpringLayout.WEST, pnlMain);
layoutMain.putConstraint(SpringLayout.EAST, spnlMacrocasistiche, -distanzaDaBordi, SpringLayout.EAST, pnlMain);
frmMain.add(pnlMain);
creaFinestraDettagliCasistiche();
frmMain.validate();
//frmMain.pack();
frmMain.setVisible(true);
frmMain.setAlwaysOnTop(true);
}
JFrame frmDettagli;
JPanel pnlDettagli;
JScrollPane spnlDettagli;
CardLayout layoutPnlDettagli = new CardLayout();
SpringLayout layoutPnlCasistiche = new SpringLayout();
private void creaFinestraDettagliCasistiche() {
int larghezzaFrmDettagli = (int)(grandezzaSchermo.getWidth() * 0.15);
int altezzaFrmDettagli = altezzaMain;
frmDettagli = new JFrame();
frmDettagli.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frmDettagli.setTitle("Controllo documenti ESE");
frmDettagli.setSize(larghezzaFrmDettagli, altezzaFrmDettagli);
Point inizioFrmDettagli = new Point((int)(inizioMain.getX() - frmDettagli.getWidth()), (int)(inizioMain.getY()));
frmDettagli.setLocation(inizioFrmDettagli);
pnlDettagli = new JPanel(layoutPnlDettagli);
Dimension dimMinPnlDettagli = new Dimension((int)(frmDettagli.getWidth()), (int)frmDettagli.getHeight());
pnlDettagli.setPreferredSize(dimMinPnlDettagli);
iFoglio = 1;
Sheet sAppoggio;
JPanel[] pnlCasistiche = new JPanel[nFogli];
JPanelCaso[] pnlCaso;
while (iFoglio < nFogli - 1) {
iFoglio++;
sAppoggio = wbDbCommentiEse.getSheet(iFoglio);
righe = sAppoggio.getRows();
colonne = sAppoggio.getColumns();
riga = 0;
colonna = 0;
pnlCasistiche[iFoglio] = new JPanel(layoutPnlCasistiche);
pnlCasistiche[iFoglio].setBorder(BorderFactory.createTitledBorder(sAppoggio.getName()));
pnlCaso = new JPanelCaso[righe];
while (riga < righe) {
pnlCaso[riga] = new JPanelCaso(sAppoggio.getCell(colonna, riga).getContents(), sAppoggio.getCell(colonna + 1, riga).getContents());
//pnlCasistiche[iFoglio].add(new JLabel("Prova"));
pnlCasistiche[iFoglio].setSize(frmDettagli.getSize());
if (riga == 0) {
layoutPnlCasistiche.putConstraint(SpringLayout.NORTH, pnlCaso[riga], distanzaDaBordi, SpringLayout.NORTH, pnlCasistiche[iFoglio]);
layoutPnlCasistiche.putConstraint(SpringLayout.WEST, pnlCaso[riga], distanzaDaBordi, SpringLayout.WEST, pnlCasistiche[iFoglio]);
layoutPnlCasistiche.putConstraint(SpringLayout.EAST, pnlCaso[riga], distanzaDaBordi, SpringLayout.EAST, pnlCasistiche[iFoglio]);
} else {
layoutPnlCasistiche.putConstraint(SpringLayout.NORTH, pnlCaso[riga], distanzaTraCasi, SpringLayout.SOUTH, pnlCaso[riga - 1]);
layoutPnlCasistiche.putConstraint(SpringLayout.WEST, pnlCaso[riga], distanzaDaBordi, SpringLayout.WEST, pnlCasistiche[iFoglio]);
layoutPnlCasistiche.putConstraint(SpringLayout.EAST, pnlCaso[riga], distanzaDaBordi, SpringLayout.EAST, pnlCasistiche[iFoglio]);
}
pnlCasistiche[iFoglio].add(pnlCaso[riga]);
riga++;
}
pnlDettagli.add(pnlCasistiche[iFoglio], sAppoggio.getName());
}
pnlDettagli.addMouseListener(new MouseListener() {
...
@Override
public void mouseExited(MouseEvent e) {
frmDettagli.dispose();
}
...
});
frmDettagli.add(pnlDettagli);
frmDettagli.validate();
}
}
显示了pnlDettagli的卡片,我可以看到边框但看不到内容,各种pnlCaso[riga];
我不明白为什么。我在添加组件之前设置了 Spring 布局并且 xls 文件充满了数据
非常感谢谁的回答,抱歉我的英语不好
frmMain.add(pnlMain);
//frmMain.pack();
frmMain.setVisible(true);
frmMain.setAlwaysOnTop(true);
creaFinestraDettagliCasistiche();
在使框架可见之前,应将所有组件添加到框架中。所以代码应该是:
frmMain.add(pnlMain);
creaFinestraDettagliCasistiche();
frmMain.pack();
frmMain.setVisible(true);
frmMain.setAlwaysOnTop(true);
如果那不能解决问题,那么我会说问题出在您的 SpringLayout 代码上。该布局通常仅由 IDE 使用,因为正确指定约束可能很困难。我建议您尝试另一个布局管理器(或布局管理器的组合)。
我已经解决了....我只需要为我的 JPanelCaso 设置首选大小......
感谢大家,主要是camickr的支持
我创建了这个扩展 JPanel 的 class JPanelCaso:
public class JPanelCaso extends JPanel implements MouseListener{
JCheckBox checkBox;
JTextArea textArea;
String frasePerCliente = "";
private int distanzaDaBordi = 0;
private int distanzaCheckTextA = 5;
private SpringLayout layoutPnlCaso = new SpringLayout();
/**
* Costruttore della classe Caso
*
* @param checkBox l' oggetto di tipo JCheckBox relativo al caso
* @param textArea l' oggetto di tipo JtextArea relativo al caso
*/
JPanelCaso(String strTitoloCaso, String frasePerCliente){
this.addMouseListener(this);
checkBox = new JCheckBox();
checkBox.addMouseListener(this);
textArea = new JTextArea(strTitoloCaso);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.addMouseListener(this);
textArea.setEditable(false);
this.frasePerCliente = frasePerCliente;
componiPannello();
}
private void componiPannello() {
this.setLayout(layoutPnlCaso);
//Dispongo i controlli
layoutPnlCaso.putConstraint(SpringLayout.WEST, checkBox, distanzaDaBordi, SpringLayout.WEST, this);
layoutPnlCaso.putConstraint(SpringLayout.EAST, checkBox, -distanzaCheckTextA, SpringLayout.WEST, textArea);
layoutPnlCaso.putConstraint(SpringLayout.WEST, textArea, -distanzaDaBordi, SpringLayout.WEST, this);
layoutPnlCaso.putConstraint(SpringLayout.NORTH, checkBox, distanzaDaBordi, SpringLayout.NORTH, this);
layoutPnlCaso.putConstraint(SpringLayout.NORTH, textArea, distanzaDaBordi, SpringLayout.NORTH, this);
layoutPnlCaso.putConstraint(SpringLayout.SOUTH, textArea, distanzaDaBordi, SpringLayout.SOUTH, this);
this.add(checkBox);
this.add(textArea);
}
}
然后我在一个 JPanel 中插入各种 JPanelCaso,这是另一个 JPanel 的卡片布局:
public class GuidaBpoEse{
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new GuidaBpoEse();
}
});
}
public GuidaBpoEse() {
creaFinestraMain();
}
Workbook wbDbCommentiEse = null;
Dimension grandezzaSchermo = Toolkit.getDefaultToolkit().getScreenSize();
int larghezzaMain = (int)(grandezzaSchermo.getWidth() * 0.20);
int altezzaMain = (int)(grandezzaSchermo.getHeight() * 0.95);
Point inizioMain = new Point((int)grandezzaSchermo.getWidth() - larghezzaMain, 0);
JFrame frmMain = new JFrame();
int nFogli;
int iFoglio = 0;
int righe; //conta le righe del iFoglio fino all' ultima piena
int colonne; //conta le colonne del iFoglio fino all' ultima piena
int riga;
int colonna;
int distanzaTraCasi = 5;
int distanzaDaBordi = 0;
static JTextArea txtaFrasiTrovate;
private void creaFinestraMain() {
try {
wbDbCommentiEse = Workbook.getWorkbook(new File("db.xls"));
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
nFogli = wbDbCommentiEse.getNumberOfSheets();
...
SpringLayout layoutMain = new SpringLayout();
JPanel pnlMain = new JPanel(layoutMain);
...
// Pannello della scelta delle macrocasistiche ==================================================
JPanel pnlMacrocasistiche = new JPanel(new GridLayout(nFogli - 2, 1));
JScrollPane spnlMacrocasistiche = null;
JButton[] btnMacrocasistiche = new JButton[nFogli]; //Salterò il primo elemento per far corrispondere l' indice dei fogli nel file excel con l' indice dei fogli nell' array di tasti
Sheet sAppoggio;
iFoglio++;
while (iFoglio < nFogli - 1) {
iFoglio++;
sAppoggio = wbDbCommentiEse.getSheet(iFoglio);
btnMacrocasistiche[iFoglio] = new JButton(sAppoggio.getName());
pnlMacrocasistiche.add(btnMacrocasistiche[iFoglio]);
btnMacrocasistiche[iFoglio].addMouseListener(new MouseListener() {
@Override
public void mouseEntered(MouseEvent arg0) {
JButton btnAppoggio = (JButton)arg0.getSource();
layoutPnlDettagli.show(pnlDettagli, btnAppoggio.getText());
frmDettagli.setVisible(true);
}
...
});
}
spnlMacrocasistiche = new JScrollPane(pnlMacrocasistiche);
spnlMacrocasistiche.setBorder(BorderFactory.createTitledBorder("Macrocasistiche"));
pnlMain.add(spnlMacrocasistiche);
// ==============================================================================================
//Posiziono spnlMacrocasistiche
spnlMacrocasistiche.setPreferredSize(new Dimension((int)frmMain.getWidth(), (int)(frmMain.getHeight() * 0.4)));;
layoutMain.putConstraint(SpringLayout.NORTH, spnlMacrocasistiche, distanzaDaBordi, SpringLayout.SOUTH, pnlDatiCliente);
layoutMain.putConstraint(SpringLayout.WEST, spnlMacrocasistiche, distanzaDaBordi, SpringLayout.WEST, pnlMain);
layoutMain.putConstraint(SpringLayout.EAST, spnlMacrocasistiche, -distanzaDaBordi, SpringLayout.EAST, pnlMain);
frmMain.add(pnlMain);
creaFinestraDettagliCasistiche();
frmMain.validate();
//frmMain.pack();
frmMain.setVisible(true);
frmMain.setAlwaysOnTop(true);
}
JFrame frmDettagli;
JPanel pnlDettagli;
JScrollPane spnlDettagli;
CardLayout layoutPnlDettagli = new CardLayout();
SpringLayout layoutPnlCasistiche = new SpringLayout();
private void creaFinestraDettagliCasistiche() {
int larghezzaFrmDettagli = (int)(grandezzaSchermo.getWidth() * 0.15);
int altezzaFrmDettagli = altezzaMain;
frmDettagli = new JFrame();
frmDettagli.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frmDettagli.setTitle("Controllo documenti ESE");
frmDettagli.setSize(larghezzaFrmDettagli, altezzaFrmDettagli);
Point inizioFrmDettagli = new Point((int)(inizioMain.getX() - frmDettagli.getWidth()), (int)(inizioMain.getY()));
frmDettagli.setLocation(inizioFrmDettagli);
pnlDettagli = new JPanel(layoutPnlDettagli);
Dimension dimMinPnlDettagli = new Dimension((int)(frmDettagli.getWidth()), (int)frmDettagli.getHeight());
pnlDettagli.setPreferredSize(dimMinPnlDettagli);
iFoglio = 1;
Sheet sAppoggio;
JPanel[] pnlCasistiche = new JPanel[nFogli];
JPanelCaso[] pnlCaso;
while (iFoglio < nFogli - 1) {
iFoglio++;
sAppoggio = wbDbCommentiEse.getSheet(iFoglio);
righe = sAppoggio.getRows();
colonne = sAppoggio.getColumns();
riga = 0;
colonna = 0;
pnlCasistiche[iFoglio] = new JPanel(layoutPnlCasistiche);
pnlCasistiche[iFoglio].setBorder(BorderFactory.createTitledBorder(sAppoggio.getName()));
pnlCaso = new JPanelCaso[righe];
while (riga < righe) {
pnlCaso[riga] = new JPanelCaso(sAppoggio.getCell(colonna, riga).getContents(), sAppoggio.getCell(colonna + 1, riga).getContents());
//pnlCasistiche[iFoglio].add(new JLabel("Prova"));
pnlCasistiche[iFoglio].setSize(frmDettagli.getSize());
if (riga == 0) {
layoutPnlCasistiche.putConstraint(SpringLayout.NORTH, pnlCaso[riga], distanzaDaBordi, SpringLayout.NORTH, pnlCasistiche[iFoglio]);
layoutPnlCasistiche.putConstraint(SpringLayout.WEST, pnlCaso[riga], distanzaDaBordi, SpringLayout.WEST, pnlCasistiche[iFoglio]);
layoutPnlCasistiche.putConstraint(SpringLayout.EAST, pnlCaso[riga], distanzaDaBordi, SpringLayout.EAST, pnlCasistiche[iFoglio]);
} else {
layoutPnlCasistiche.putConstraint(SpringLayout.NORTH, pnlCaso[riga], distanzaTraCasi, SpringLayout.SOUTH, pnlCaso[riga - 1]);
layoutPnlCasistiche.putConstraint(SpringLayout.WEST, pnlCaso[riga], distanzaDaBordi, SpringLayout.WEST, pnlCasistiche[iFoglio]);
layoutPnlCasistiche.putConstraint(SpringLayout.EAST, pnlCaso[riga], distanzaDaBordi, SpringLayout.EAST, pnlCasistiche[iFoglio]);
}
pnlCasistiche[iFoglio].add(pnlCaso[riga]);
riga++;
}
pnlDettagli.add(pnlCasistiche[iFoglio], sAppoggio.getName());
}
pnlDettagli.addMouseListener(new MouseListener() {
...
@Override
public void mouseExited(MouseEvent e) {
frmDettagli.dispose();
}
...
});
frmDettagli.add(pnlDettagli);
frmDettagli.validate();
}
}
显示了pnlDettagli的卡片,我可以看到边框但看不到内容,各种pnlCaso[riga];
我不明白为什么。我在添加组件之前设置了 Spring 布局并且 xls 文件充满了数据
非常感谢谁的回答,抱歉我的英语不好
frmMain.add(pnlMain);
//frmMain.pack();
frmMain.setVisible(true);
frmMain.setAlwaysOnTop(true);
creaFinestraDettagliCasistiche();
在使框架可见之前,应将所有组件添加到框架中。所以代码应该是:
frmMain.add(pnlMain);
creaFinestraDettagliCasistiche();
frmMain.pack();
frmMain.setVisible(true);
frmMain.setAlwaysOnTop(true);
如果那不能解决问题,那么我会说问题出在您的 SpringLayout 代码上。该布局通常仅由 IDE 使用,因为正确指定约束可能很困难。我建议您尝试另一个布局管理器(或布局管理器的组合)。
我已经解决了....我只需要为我的 JPanelCaso 设置首选大小......
感谢大家,主要是camickr的支持