В настоящее время я работаю над программой Java и имею проблему с программой, которая ничего не отображает.Окно JFrame, отказавшееся открыть
В основной метод является следующий код:
WindowClient client = new WindowClient();
client.pack();
client.setVisible(true);
И WindowClient:
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.SpringLayout;
import org.datacontract.schemas._2004._07.NaturalDisasterService.NaturalDisaster;
import org.tempuri.INaturalDisasterServiceProxy;
import java.awt.BorderLayout;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.Font;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.awt.event.ActionEvent;
public class WindowClient extends JFrame {
private INaturalDisasterServiceProxy ndsp;
private JTextField textDisasterName; // text box on insertPanel for disaster names
private JTextField textDisasterDescription; // text box on insertPanel for disaster descriptions
public JPanel insertPanel, detailPanel;
public JList list; // the list
public JLabel lblDisasterNameStaticInsert, //displays text "Disaster Name:" on insertPanel
lblDisasterDescStaticInsert, // displays text "Disaster Description:" on insertPanel
lblDisasterDescDataDetail, // displays disaster description from database on detailPanel
lblDisasterDescStaticDetail; // label displays text "Disaster Desc:" on detailPanel
public WindowClient() {
buildWindow();
ndsp = new INaturalDisasterServiceProxy();
ndsp.setEndpoint("url redacted");
updateList();
}
/**
* @param args
*/
public void getSelection() {
showDetailPanel();
}
public void insertLoad() {
if (detailPanel.isVisible()) {
hideDetailPanel();
}
showInsertPanel();
}
public void saveToDB() {
hideInsertPanel();
}
public void updateList() {
NaturalDisaster nds[];
try {
nds = ndsp.getData();
DefaultListModel model = new DefaultListModel();
for(NaturalDisaster disaster : nds){
model.addElement(disaster.getDisasterName());
}
getContentPane().remove(list);
list = new JList(model);
list.setBounds(81, 11, 247, 132);
getContentPane().add(list);
getContentPane().repaint();
getContentPane().revalidate();
} catch (RemoteException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
//e.printStackTrace();
}
}
public void buildWindow() {
getContentPane().setLayout(null);
list = new JList();
list.setBounds(81, 11, 247, 132);
getContentPane().add(list);
insertPanel = new JPanel();
insertPanel.setBounds(10, 150, 414, 67);
getContentPane().add(insertPanel);
insertPanel.setLayout(null);
detailPanel = new JPanel();
detailPanel.setBounds(10, 150, 414, 67);
detailPanel.setLayout(null);
// Label for disaster names on insertPanel
lblDisasterNameStaticInsert = new JLabel("Disaster Name:");
lblDisasterNameStaticInsert.setFont(new Font("Tahoma", Font.BOLD, 11));
lblDisasterNameStaticInsert.setBounds(10, 5, 105, 14);
insertPanel.add(lblDisasterNameStaticInsert);
// label for disaster descripitons on the insertPanel
lblDisasterDescStaticInsert = new JLabel("Disaster Description:");
lblDisasterDescStaticInsert.setFont(new Font("Tahoma", Font.BOLD, 11));
lblDisasterDescStaticInsert.setBounds(10, 30, 120, 14);
insertPanel.add(lblDisasterDescStaticInsert);
// text boxes on the insertPanel
textDisasterName = new JTextField();
textDisasterName.setBounds(138, 2, 266, 20);
insertPanel.add(textDisasterName);
textDisasterName.setColumns(10);
textDisasterDescription = new JTextField();
textDisasterDescription.setBounds(138, 27, 266, 20);
insertPanel.add(textDisasterDescription);
textDisasterDescription.setColumns(10);
getContentPane().add(detailPanel);
// label for the disaster description from database on display panel
lblDisasterDescDataDetail = new JLabel("New label");
lblDisasterDescDataDetail.setBounds(10, 30, 120, 14);
detailPanel.add(lblDisasterDescDataDetail);
// label displays text "Disaster Desc:" on display panel
lblDisasterDescStaticDetail = new JLabel("Disaster Desc:");
lblDisasterDescStaticDetail.setBounds(10, 5, 105, 14);
detailPanel.add(lblDisasterDescStaticDetail);
JButton btnGetSelection = new JButton("Get Selection");
btnGetSelection.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
getSelection();
}
});
btnGetSelection.setBounds(10, 228, 105, 23);
getContentPane().add(btnGetSelection);
JButton btnInsert = new JButton("Insert");
btnInsert.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
insertLoad();
}
});
btnInsert.setBounds(125, 228, 124, 23);
getContentPane().add(btnInsert);
JButton btnSave = new JButton("Save Info to DB");
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveToDB();
}
});
btnSave.setBounds(259, 228, 165, 23);
getContentPane().add(btnSave);
//getContentPane().setVisible(true);
}
public void hideInsertPanel() {
getContentPane().remove(insertPanel);
insertPanel.setVisible(false);
}
public void showInsertPanel() {
getContentPane().add(insertPanel);
insertPanel.setVisible(true);
insertPanel.getParent().revalidate();
}
public void hideDetailPanel() {
getContentPane().remove(detailPanel);
detailPanel.setVisible(false);
}
public void showDetailPanel() {
getContentPane().add(detailPanel);
detailPanel.setVisible(true);
detailPanel.getParent().revalidate();
}
}
Некоторые другие вопросы по проблеме JFrame неисправности упомянуть необходимость setVisible()
и pack()
, но Я сделал оба этих звонка. Единственный результат заключается в том, что программа запускается, и программа открывается на панели задач Windows, но не имеет соответствующего окна (в окне предварительного просмотра отображается тонкая белая полоса, которая не отображается, если программа выбрана как активная).
Хотя это не первая проблема, это моя первая работа с Swing через несколько лет, поэтому не стесняйтесь указывать на другие ошибки.
Когда я 1) комментирую пользовательские классы 2) исправляем любые возникающие ошибки компиляции, комментируя строки, которые они встречаются, и 3) добавляем «код в главном» в качестве основного для этого класса, я вижу: очень маленький GUI. Когда я перетаскиваю размер больше, я вижу компоненты. Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –
BTW: графические интерфейсы Java должны работать с различными ОС, размером экрана, разрешением экрана и т. Д., Используя разные PLAF в разных локалях. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). ** Обратите внимание на [это изображение] (https://i.stack.imgur.com/uKThv.png), как область текста не центрирована, а текст одной кнопки усечен? Это то, что * макеты были разработаны для обработки. *** –
'pack' будет работать только в том случае, если ваш контент использует API управления компоновкой. – MadProgrammer