#java #user-interface #dynamic #jpanel
#java #пользовательский интерфейс #динамическая #jpanel
Вопрос:
Может кто-нибудь взглянуть на эту часть моего кода и сказать мне, почему он не возвращает объекты внутри JPanel? Это определенно происходит внутри цикла, поскольку я пытался печатать инструкции внутри. Также этот объект JPanel помещается внутри TabbedPane просто для пояснения. Дайте мне знать, если мне нужно объяснить более подробно или показать больше кода, чтобы найти решение. Спасибо.
JPanel createTipTailoringPanel(TipCalcModel model)
{
JPanel content = new JPanel();
int size = model.getNumOfPeople();
content.removeAll();
content.updateUI();
content.setLayout(new GridLayout(0,4));
JTextField text[] = new JTextField[size];
JSlider slider[] = new JSlider[size];
JLabel label[] = new JLabel[size];
JLabel cash[] = new JLabel[size];
if(size == 0)
{
return content;
}
else
{
for(int i=0; i<size; i )
{
text[i] = new JTextField();
slider[i] = new JSlider();
label[i] = new JLabel("$");
cash[i] = new JLabel();
content.add(text[i]);
content.add(slider[i]);
content.add(label[i]);
content.add(cash[i]);
}
return content;
}
}
Вот мой вызывающий метод и actionlistener, который я использую для передачи numberofpeople:
TipCalcView(TipCalcModel model)
{
setTitle("Tip Calculator");
JTabbedPane tabbedPane = new JTabbedPane();
getContentPane().add(tabbedPane);
tabbedPane.addTab("Main Menu", createMainPanel());
tabbedPane.setSelectedIndex(0);
tabbedPane.addTab("Tip Tailoring", createTipTailoringPanel(model));
tabbedPane.addTab("Config Panel", createConfigPanel());
}
class GuestsListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
int userInput = 0;
try{
userInput = m_view.getGuests();
m_model.setNumOfPeople(userInput);
m_view.createTipTailoringPanel(m_model);
}
catch(NumberFormatException nfex)
{
m_view.showError("Bad input: '" userInput "'");
}
}
}
Комментарии:
1. можете ли вы опубликовать код, который вызывает этот метод?
Ответ №1:
Я подозреваю, что ваша проблема находится за пределами указанного вами кода. Вот упрощенный рабочий пример:
public static void main(String[] args) {
JFrame frame = new JFrame();
DynamicJPanel dynamic = new DynamicJPanel();
frame.add(dynamic.createTipTailoringPanel(3));
frame.pack();
frame.setVisible(true);
}
JPanel createTipTailoringPanel(int size) {
JPanel content = new JPanel();
content.setLayout(new GridLayout(0, 4));
for (int i = 0; i < size; i ) {
content.add(new JTextField());
content.add(new JSlider());
content.add(new JLabel("$"));
content.add(new JLabel());
}
return content;
}
Комментарии:
1. Да, это как-то связано с тем, что мой JFrame был неправильно реализован.
Ответ №2:
Во-первых, поскольку вы нигде не используете массивы, его можно сократить до:
JPanel createTipTailoringPanel(TipCalcModel model)
{
JPanel content = new JPanel();
int size = model.getNumOfPeople();
content.setLayout(new GridLayout(0,4));
if(size == 0)
{
return content;
}
else
{
for(int i=0; i<size; i )
{
content.add(new JTextField());
content.add(new JSlider());
content.add(new JLabel("$"));
content.add(new JLabel());
}
return content;
}
}
Во-вторых, похоже, что вы добавляете пустые компоненты на панель, может быть, это то, что вы на самом деле получаете?
В-третьих, добавить вам нужно добавить content
панель в JFrame (или другой контейнер), как только она вернется из описанного выше метода.
Комментарии:
1. в-четвертых и в-пятых, вызовы
removeAll()
иupdateUI()
являются излишними.2. @afk — вы правы, я скопировал, не глядя на это, поскольку массив меня беспокоил. спасибо, что указали на это.
3. О, ваше право, мне действительно не нужны массивы, хотя, когда я попробовал программу после изменения кода, она по-прежнему ничего не показывает, я отредактирую свой основной пост и покажу свой код, где я вызываю этот метод. Я также прокомментировал removeall и updateUI.
4. @Novazero — похоже, проблема находится за пределами этого метода, как сказал @WhiteFang34, нам нужно увидеть метод, который вызывает этот…