1

好吧!所以我的问题是,容器(续)在程序运行时没有显示。我尝试直接将容器中的所有内容添加到 pangui2,但没有成功,并且运行时产生了相同的结果,并且只显示了 JTextArea。我很感激帮助。

package guiprojj;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Map;

import javax.swing.*;

import com.eclipsesource.json.JsonObject;
import com.google.gson.JsonParser;
import com.json.parsers.JSONParser;
import com.json.parsers.JsonParserFactory;


public class gui {
    public static void main(String[] args)
    {
        JFrame maingui = new JFrame("Gui");
        JButton enter = new JButton("Enter");
        final JTextArea movieinfo = new JTextArea(5,20);
        final JTextField movietext = new JTextField(16);
        final JScrollPane scrolll = new JScrollPane(movieinfo);
        final JLabel titlee = new JLabel("Enter movie name here:");
        final Container cont = new Container();
        JPanel pangui = new JPanel();
        JPanel pangui2 = new JPanel();
        maingui.add(pangui2);
        maingui.add(pangui);
        maingui.setResizable(false);
        maingui.setVisible(true);
        pangui.add(scrolll);
        pangui2.add(cont);
        cont.add(titlee);
        cont.add(movietext);
        cont.add(enter);
        movieinfo.setLineWrap(true);
        movieinfo.setWrapStyleWord(true);
        movieinfo.setEditable(false);
        scrolll.getPreferredSize();
        maingui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        maingui.pack();
        enter.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)  
            {
                System.out.println(Test.getMovieInfo(movietext.getText()));
                 JsonParserFactory factory=JsonParserFactory.getInstance();
                 JSONParser parser=factory.newJsonParser();
                 Map jsonData=parser.parseJson(Test.getMovieInfo(movietext.getText()));
                 String Title = (String)jsonData.get("Title");
                 String Year = (String)jsonData.get("Year");
                 String Plot = (String)jsonData.get("Plot");
                 movieinfo.setText("Title: "+Title+"\nYear: "+ Year +"\nPlot: "+Plot);
            }
            });

        }
}

在尝试了您的解决方案后,我什么也没得到,而不仅仅是 TextArea。

package guiprojj;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Map;

import javax.swing.*;

import com.eclipsesource.json.JsonObject;
import com.google.gson.JsonParser;
import com.json.parsers.JSONParser;
import com.json.parsers.JsonParserFactory;


public class gui {
    final static String SCROLL = "Card with JButtons";
    final static String BOX = "Card with JTextField";
    public static void main(String[] args)
    {
        JFrame maingui = new JFrame("Gui");
        JButton enter = new JButton("Enter");
        final JTextArea movieinfo = new JTextArea(5,20);
        final JTextField movietext = new JTextField(16);
        final JScrollPane scrolll = new JScrollPane(movieinfo);
        final JLabel titlee = new JLabel("Enter movie name here:");
        final Container cont = new Container();
        JPanel cards = new JPanel(new CardLayout());
        JPanel pangui = new JPanel();
        JPanel pangui2 = new JPanel();
        maingui.add(cards);
        cards.add(pangui2, SCROLL);
        cards.add(pangui2, BOX);
        maingui.setResizable(false);
        maingui.setVisible(true);
        pangui.add(scrolll);
        pangui2.add(cont);
        cont.add(titlee);
        cont.add(movietext);
        cont.add(enter);
        movieinfo.setLineWrap(true);
        movieinfo.setWrapStyleWord(true);
        movieinfo.setEditable(false);
        scrolll.getPreferredSize();
        maingui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        maingui.pack();
        enter.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)  
            {
                System.out.println(Test.getMovieInfo(movietext.getText()));
                 JsonParserFactory factory=JsonParserFactory.getInstance();
                 JSONParser parser=factory.newJsonParser();
                 Map jsonData=parser.parseJson(Test.getMovieInfo(movietext.getText()));
                 String Title = (String)jsonData.get("Title");
                 String Year = (String)jsonData.get("Year");
                 String Plot = (String)jsonData.get("Plot");
                 movieinfo.setText("Title: "+Title+"\nYear: "+ Year +"\nPlot: "+Plot);
            }
            });

        }
}
4

1 回答 1

3

您的 JFrame 默认使用 BorderLayout,并且以默认方式添加到使用 BorderLayout 的容器的组件转到 BorderLayout.CENTER 位置。这意味着您第二次添加到 JFrame 的组件覆盖了首先添加的组件:

maingui.add(pangui2);
maingui.add(pangui); // this will cover pangui2

考虑为 JFrame 的 contentPane 提供不同的布局,例如 GridLayout。

  • 顺便说一句:为什么在这里使用 AWT Container 而不是 Swing JPanel?
  • 除了#2:我不确定这条线试图实现什么:scrolll.getPreferredSize();
  • 除了#3:您是否使用静态 main 方法只是为了演示您当前的问题?还是您当前的“生产”代码上方的代码?如果是后者,那么您将希望将大部分代码从 main 方法中取出并放入构造函数和实例方法中。main 方法应该只关注设置程序和启动它,仅此而已。

编辑
你状态:

我不想交换任何东西,我实际上只是希望它在文本区域上方的文本字段上方有一个标签。

那么 CardLayout 不是您想要使用的,因为它仅用于交换和交换(因为 tut 会告诉您)。对于 JTextField 上方的 JLabel,请考虑使用带有 BorderLayout 的 JPanel,其中 JLabel 位于该BorderLayout.NORTH位置,JTextField 位于该BorderLayout.CENTER位置。然后创建另一个带有 BorderLayout 的 JPanel,并将上面的 JPanel 放置到新 JPanel 的BorderLayout.NORTH位置以及将 JTextArea 保存在该BorderLayout.CENTER位置的 JScrollPane。

但最重要的是,您应该阅读教程,因为它们会告诉您并告诉您如何使用布局。猜测永远无法解决这个问题。

于 2013-09-17T21:11:36.240 回答