#java #swing #user-interface
#java #качать #пользовательский интерфейс
Вопрос:
Я пытался добавить две панели, в которых каждая имеет свои собственные компоненты, на другую панель, но при выполнении программы две панели просто объединяются друг с другом. Пожалуйста, ознакомьтесь с моим кодом.
import javax.swing.*;
import java.awt.*;
/*
* 2 Labels for withdraw/deposit.
* 2 Textfields for entering withdrawal/deposit amount.
* 1 Label for balance, 1 non-editable textfield for balance.
* Event listener on the calculate button.
* Action performed: balance minors withdrawal plus deposit
*/
/ **
* This class manages the input numbers. User will input withdrawal/deposit amount
* and the program will display the balacne after transfers.
* @author Administrator
*
*/
public class DataPanel extends JPanel {
public final int TEXTFIELD_LENGTH = 10;
public final int LAYOUT_VGAP = 25;
public final int LAYOUT_HGAP = 15;
/**
* Constructor sets layout, creates labels/fields.
*/
public JPanel pane1 = new JPanel();
public JPanel pane2 = new JPanel();
public JPanel pane = new JPanel(new GridLayout(1,2));
//Create necessary fields and labels
JLabel withdrawalLabel = new JLabel("Withdrawal: ");
JLabel depositLabel = new JLabel("deposit: ");
JTextField withdrawalText = new JTextField(TEXTFIELD_LENGTH);
JTextField depositText = new JTextField(TEXTFIELD_LENGTH);
JLabel balanceLabel = new JLabel("Balance: ");
JTextField balanceTextField = new JTextField(TEXTFIELD_LENGTH);
JLabel totalSavingLabel = new JLabel("Recently You Saved: ");
JTextField totalSavingTextField = new JTextField(TEXTFIELD_LENGTH);
JLabel totalSpentLabel = new JLabel("Recently You Spent: ");
JTextField totalSpentTextField = new JTextField(TEXTFIELD_LENGTH);
//set some textfields non editable.
//set layout, 3 rows 2 columns.
public DataPanel()
{
setLayout(new GridLayout(2,1));
buildPane1();
buildPane2();
buildPane();
add(pane);
//add components to panel DataPanel.
}
public void buildPane()
{
pane.add(pane1);
pane.add(pane2);
}
public void buildPane1()
{
setLayout(new GridLayout(3,2));
setBorder(BorderFactory.createLineBorder(Color.PINK, 2, true));
balanceTextField.setEditable(false);
pane1.add(withdrawalLabel);
pane1.add(withdrawalText);
pane1.add(depositLabel);
pane1.add(depositText);
pane1.add(balanceLabel);
pane1.add(balanceTextField);
}
public void buildPane2()
{
setLayout(new GridLayout(2,2));
setBorder(BorderFactory.createLineBorder(Color.black, 2, true));
totalSavingTextField.setEditable(false);
totalSpentTextField.setEditable(false);
pane2.add(totalSavingLabel);
pane2.add(totalSavingTextField);
pane2.add(totalSpentLabel);
pane2.add(totalSpentTextField);
}
}
Класс JFrame:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
public class MainFrame extends JFrame {
public final int WIDTH = 1000;
public final int HEIGHT = 800;
public DataPanel dataPane;
public InfoPanel infoPane;
public Menu menu;
public JTabbedPane tabbedPane = new JTabbedPane();
//tab #1
public JPanel spendingPane;
//tab #2
public JPanel personalPane;
//tab #3
public JPanel socialPane;
//tab #4
public JPanel chatPane;
/**
* Constructor.
*/
public MainFrame()
{
setTitle("Personal Banking");
setSize(WIDTH, HEIGHT);
setLayout(new BorderLayout());
buildMenu();
buildPanel();
add(tabbedPane);
pack();
setVisible(true);
}
/**
* This methods builds all the components.
*/
private void buildPanel()
{
//build main panel (Spending panel).
dataPane = new DataPanel();
//add numbers panel to the tabbed panel.
tabbedPane.addTab("Numbers", dataPane);
//build personal information panel.
infoPane = new InfoPanel();
personalPane = new JPanel();
personalPane.add(infoPane);
//add personal information panel to the tabbed panel.
tabbedPane.addTab("Personal", personalPane);
}
/**
* This function builds menu bar and menu items.
*/
private void buildMenu()
{
menu = new Menu();
setJMenuBar(menu.mainMenuBar);
}
public static void main(String args[])
{
new MainFrame();
}
}
Я пробовал несколько методов, но на самом деле они не сработали.
*** Ну, видимо, я вставил первый класс дважды. Теперь я это исправил. Извините за это.
Комментарии:
1. Обе панели добавлены правильно (насколько я могу судить), но вы применяете макет и границу к родительской панели, не уверен, что это то, чего вы пытаетесь достичь…
2. можете ли вы добавить метод main, который будет показывать фактический результат при запуске?
3. Можете ли вы дать некоторое представление о том, как это должно выглядеть / выглядеть?
4. Привет, ребята, спасибо за ответ. MadProgrammer — я пытался сделать так, чтобы две панели выглядели различимыми на этой одной панели, например, 3 строки и 2 столбца в левом компоненте и 2 строки и 2 панели в правом компоненте. Нихил — Да, я отредактирую свой пост.
5. Совет: Добавьте знак
@
перед именем, чтобы убедиться, что пользователь будет уведомлен о новом комментарии. Используя префикс, только один человек может быть уведомлен за каждый комментарий.
Ответ №1:
Основываясь на вашем примере (и небольшом изменении цвета фона каждой панели), вы можете видеть, что они были добавлены
Однако это…
public void buildPane1()
{
setLayout(new GridLayout(3,2));
setBorder(BorderFactory.createLineBorder(Color.PINK, 2, true));
и это…
public void buildPane2()
{
setLayout(new GridLayout(2,2));
setBorder(BorderFactory.createLineBorder(Color.black, 2, true));
выглядят очень подозрительно, поскольку они применяются к DataPanel
, а не (как я подозреваю, вы хотите) к отдельным панелям…
Так что меняем их, чтобы они выглядели более похожими…
public void buildPane1() {
pane1.setLayout(new GridLayout(3, 2));
pane1.setBorder(BorderFactory.createLineBorder(Color.PINK, 2, true));
//...
public void buildPane2() {
pane2.setLayout(new GridLayout(2, 2));
pane2.setBorder(BorderFactory.createLineBorder(Color.black, 2, true));
Дает мне…
Комментарии:
1. Спасибо! Теперь я понимаю! Изначально я устанавливал макет для панели данных, а не для отдельных панелей, которые я хотел. Теперь это имеет смысл !!
![]()
2. Рад, что это помогло, смутило меня;)