Jframe não funcionando corretamente
-
28-09-2019 - |
Pergunta
Isso está me deixando com muita raiva, eu trabalhei nisso há 2 dias, abriu 2 livros e os examinei e ainda não consigo fazer esse programa para executar da maneira que eu quero correr. Estou chegando ao ponto em que, se isso não ajudar, eu parei.
Eu quero um aplicativo de quadro simples. Possui um JCOMBOBOX centrado no topo. Ao lado, há um campo de texto grande o suficiente para mostrar dígitos numéricos como "US $ 49,99" abaixo, é um local para uma área de texto mostrando termos de serviço abaixo, que é a caixa de seleção que concorda com os termos de serviço abaixo que são 2 botões "Aceitar" e "declínio"
Eu trabalhei nisso por 2 dias, aqui está a codificação:
public class Bar extends JFrame implements ActionListener
{
public Bar(final JFrame frame)
{
String[] tests = { "A+ Certification", "Network+ Certification", "Security+ Certification", "CIT Full Test Package" };
JButton button = new JButton("Click Meh");
add(new JLabel("Welcome to the CIT Test Program "));
add(new JLabel("Please select which Test Package from the list below."));
frame.setVisible(true);
frame.setSize(250,250);
JPanel pane1 = new JPanel(new FlowLayout());
JPanel pane2 = new JPanel(new FlowLayout());
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenu editMenu = new JMenu("Edit");
JMenu helpMenu = new JMenu("Help");
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(helpMenu);
JMenuItem newMenu = new JMenuItem("New (Ctrl+N)");
JMenuItem openMenu = new JMenuItem("Open (Ctrl+O)");
JMenuItem saveMenu = new JMenuItem("Save (Ctrl+S)");
saveMenu.addActionListener(this);
JMenuItem exitMenu = new JMenuItem("Exit (Ctrl+W)");
JMenuItem cutMenu = new JMenuItem("Cut (Ctrl+X)");
JMenuItem copyMenu = new JMenuItem("Copy (Ctrl+C)");
JMenuItem pasteMenu = new JMenuItem("Paste (Ctrl+V)");
JMenuItem infoMenu = new JMenuItem("Help (Ctrl+H)");
fileMenu.add(newMenu);
fileMenu.add(openMenu);
fileMenu.add(saveMenu);
fileMenu.add(exitMenu);
editMenu.add(cutMenu);
editMenu.add(copyMenu);
editMenu.add(pasteMenu);
helpMenu.add(infoMenu);
frame.setJMenuBar(menuBar);
JComboBox packageChoice = new JComboBox(tests);
frame.add(packageChoice);
}
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
{
}
}
Editar: esqueci de adicionar o segundo programa
public class JFrameWithPanel
{
public static void main(String[] args)
{
JPanel panel = new Bar(new JFrame("CIT Test Program"));
}
}
Como faço para que isso tenha tudo onde eu quero e apareço? Estou muito confuso por causa disso e agora mal consegui como os quadros funcionam.
Solução
Os componentes em swing devem ser dispostos em uma certa ordem.
Você começa com um jframe. Os únicos componentes que são colocados no JFrame são um jmenubar e um jpanel. Você não adiciona outros componentes em um JFrame. Você adiciona componentes em um jpanel.
Aqui está o código de Nick, reorganizado para definir os componentes na ordem correta. Eu usei o GridLayout porque era mais rápido. Você deve usar o GridBaglayout, como Nivas disse.
public class Bar {
private static final long serialVersionUID = 1L;
public Bar(final JFrame frame) {
JMenuBar menuBar = buildMenuBar();
frame.setJMenuBar(menuBar);
JPanel masterPanel = new JPanel(new GridLayout(2, 1));
JPanel pane1 = new JPanel(new GridLayout(3, 1));
pane1.add(new JLabel("Welcome to the CIT Test Program "));
pane1.add(new JLabel("Please select which Test Package from the list below."));
JButton button = new JButton("Click Me");
pane1.add(button);
JPanel pane2 = new JPanel(new GridLayout(1, 1));
String[] tests = { "A+ Certification", "Network+ Certification",
"Security+ Certification", "CIT Full Test Package" };
JComboBox packageChoice = new JComboBox(tests);
pane2.add(packageChoice);
masterPanel.add(pane1);
masterPanel.add(pane2);
frame.add(masterPanel);
frame.pack();
frame.setVisible(true);
// frame.setSize(250, 250);
}
public JMenuBar buildMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenu editMenu = new JMenu("Edit");
JMenu helpMenu = new JMenu("Help");
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(helpMenu);
JMenuItem newMenu = new JMenuItem("New (Ctrl+N)");
JMenuItem openMenu = new JMenuItem("Open (Ctrl+O)");
JMenuItem saveMenu = new JMenuItem("Save (Ctrl+S)");
saveMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
});
JMenuItem exitMenu = new JMenuItem("Exit (Ctrl+W)");
JMenuItem cutMenu = new JMenuItem("Cut (Ctrl+X)");
JMenuItem copyMenu = new JMenuItem("Copy (Ctrl+C)");
JMenuItem pasteMenu = new JMenuItem("Paste (Ctrl+V)");
JMenuItem infoMenu = new JMenuItem("Help (Ctrl+H)");
fileMenu.add(newMenu);
fileMenu.add(openMenu);
fileMenu.add(saveMenu);
fileMenu.add(exitMenu);
editMenu.add(cutMenu);
editMenu.add(copyMenu);
editMenu.add(pasteMenu);
helpMenu.add(infoMenu);
return menuBar;
}
}
Eu movi o código Jmenubar para seu próprio método, então, esperançosamente, o restante do código é mais fácil de entender.
Eu tenho um mestre jpanel, para o qual todos os outros componentes são adicionados.
Usei outro JPanel para segurar os dois Jlabels e o JButton.
Eu usei um terceiro JPanel para segurar o JCOMBOBOX.
O padrão básico é o seguinte:
- Defina o JPanel.
- Defina os componentes.
- Adicione os componentes ao JPanel.
- Adicione o jpanel ao mestre jpanel
- Adicione o mestre jpanel ao jframe.
Outras dicas
Usuario. Eu acho que a primeira coisa que você precisa esclarecer é saber exatamente o que deseja.
Eu te ajudei nesta pergunta https: //stackoverflow.com/questions/30557777/how---th -...
Pelo que você está descrevendo, você já tem o que precisa. O que há de errado com isso:
Então, eu realmente acho que você deve descrever claramente o que deseja, para obtê -lo.
Nós o ajudaríamos, mas você deve definir claramente qual é o seu problema.
1. Seu segundo programa não vai compilar. Você está tentando atribuir um JFrame a um JPanel.
Deveria ter sido
JFrame frame = new Bar(new JFrame("CIT Test Program"));
2. Funciona. O que você quer está lá. Mas não como você deseja, porque você não disse a Java como deseja que ele seja exibido. Tente usar um LayoutManager Curti Gridbaglayout.
Se você estiver com pressa de criar uma GUI, tente um IDE como NetBeans que facilita seu trabalho por arrastar e soltar.
EDITAR:
Um exemplo:
public class TestN extends JFrame
{
private JLabel label ;
private JComboBox combo;
private JButton button;
public TestN()
{
label = new JLabel("Label:");
combo = new JComboBox();
combo.addItem("Item 1");
combo.addItem("Item 2");
combo.addItem("Item 3");
setLayout(new GridBagLayout());
GridBagConstraints c1 = new GridBagConstraints();
c1.gridx = 0;
c1.gridy = 0;
c1.weightx = 1;
c1.weighty = 1;
add(label, c1);
GridBagConstraints c2 = new GridBagConstraints();
c2.gridx = 1;
c2.gridy = 0;
c2.weightx = 1;
c2.weighty = 1;
add(combo, c2);
button = new JButton("Ok");
GridBagConstraints c3 = new GridBagConstraints();
c3.gridx = 2;
c3.gridy = 0;
c3.weightx = 1;
c3.weighty = 1;
add(button, c3);
setTitle("Test");
setSize(200,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args)
{
new TestN();
}
}
Isenção de responsabilidade: Este é um exemplo básico apenas para dar um exemplo. Não deve ser o código de produção ;-)
Você tem:
public class Bar extends JFrame implements ActionListener
{
public Bar(final JFrame frame)
{
String[] tests = { "A+ Certification", "Network+ Certification", "Security+ Certification", "CIT Full Test Package" };
JButton button = new JButton("Click Meh");
add(new JLabel("Welcome to the CIT Test Program "));
add(new JLabel("Please select which Test Package from the list below."));
frame.setVisible(true);
frame.setSize(250,250);
Cada Bar
objeto herda de JFrame
(ou seja, a Bar
objeto é um tipo de JFrame
) Mas você passa em um diferente JFrame
objeto (o frame
parâmetro) no construtor. Você então chama alguns métodos no Bar
objeto - como adicionar os dois JLabel
objetos - e alguns no passado JFrame
- tais como o setVisible
e setSize
métodos.
Então você tem dois diferentes JFrame
Objetos e você trabalha com cada um deles e apenas um deles está pronto para ser visível.
Parece que é a única razão pela qual você está passando no JFrame
Para o construtor é definir o título da janela. Se você passar em um String
com o título para o Bar
construtor e depois ligar super(title);
Como a primeira linha do Bar
construtor então você não precisará do passado JFrame
de forma alguma