【问题标题】:JTextArea & JPanel different classes one window...is it possible?JTextArea & JPanel 不同的类一个窗口...有可能吗?
【发布时间】:2015-11-02 09:10:33
【问题描述】:

所以我有两个类:

public class TimeServer extends JPanel implements TimeVariables
{

public TimeServer() 
{

    JTextArea serverLog = new JTextArea();
    // Create a scroll pane to hold text area
    JScrollPane scrollPane = new JScrollPane(serverLog);

    JPanel serverWin = new JPanel();

    serverWin.add(scrollPane);

}

另一个类具有:

private JPanel mainWin = new JPanel();
private JPanel gridArea = new JPanel(); //hold cells

TimeServer serverWin = new TimeServer();

public class TimClient extends JFrame implements Runnable, TimeVariables 
{
    his.add(mainWin, BorderLayout.CENTER);
    mainWin.setLayout(new BorderLayout());
   // mainWin.setLayout(new GridLayout(1,2));

    //Create Grid
    gridArea.setLayout(new GridLayout(10, 10, 2, 2));

    for (int i = 0; i < 10; i++)
        for (int j = 0; j < 10; j++)
            gridArea.add(cell[i][j] = new Cell(i, j, this));

    gridArea.setBorder(new LineBorder(Color.black, 1));

    jlblTitle.setHorizontalAlignment(JLabel.CENTER);
    jlblTitle.setFont(new Font("SansSerif", Font.BOLD, 16));
    jlblTitle.setBorder(new LineBorder(Color.black, 1));
    jlblStatus.setBorder(new LineBorder(Color.black, 1));

    mainWin.add(gridArea, BorderLayout.CENTER);
    mainWin.add(serverWin, BorderLayout.PAGE_END);
    // Place the panel and the labels to the frame

    setLayout(new BorderLayout()); // implicit anyway

    add(jlblTitle, BorderLayout.NORTH);
    add(mainWin, BorderLayout.CENTER);
    add(jlblStatus, BorderLayout.SOUTH);
}

public static void main(String[] args) {

    // Create a frame
    TimClient frame = new TimClient("Time Client");
    //frame.getContentPane().add(BorderLayout)

    // Display the frame
    frame.setSize(620, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}

我想要做的就是让 JPanel 中的服务器日志和网格彼此相邻,你能解释一下如何吗?

还有如何将服务器类中的 JPanel 添加到客户端类中?

这是我希望它看起来如何的草图:

【问题讨论】:

  • 删除问题的内容对以后的任何人都没有帮助......

标签: java user-interface jpanel jtextarea


【解决方案1】:

您的上述问题似乎源于不良的 Swing 代码实践,Swing 代码生成器(尽管我不确定您当前是否正在使用此工具)和官方 Swing 教程似乎加强了这一实践,而且是:

  • 首先,您应该避免让您的 Swing GUI 类扩展 JFrame,因为这会不必要地将您的 GUI 代码绘制到一个需要一些努力才能摆脱的角落。
  • 而是将 Swing GUI 代码用于制作 JPanel,这些面板现在可以轻松地放入其他 JPanel 或 JFrame、JDialogs、JOptionPanes、在 CardLayouts 中交换……任何需要的地方。
  • 而是在需要时创建、填充和打包 JFrame。

所以我建议你这样做:

  • 更改上面的代码,使类不扩展 JFrame,而是创建 JPanel,
  • 创建一个使用 BorderLayout 的主 JPanel
  • 将您的网格添加到上面的 BorderLayout.CENTER
  • 将包含 JTextArea 的 JScrollPane 及其 JPanel 添加到 BorderLayout.PAGE_END 位置的主 JPanel 中。
  • 创建您的 JFrame 以保存和显示主 JPanel。

如果您在将 GUI 代码与逻辑代码分离方面做得很好,那么在保持相同逻辑(或“模型”)代码的同时重写 GUI 代码应该很容易。


编辑 2
关于您更改的问题,现在第一个类扩展 JPanel,只需将该 JPanel 添加到您的 JFrame 中的 BorderLayout.LINE_END 端(也称为 BorderLayout.EAST)位置。

【讨论】:

  • 我正计划将服务器类从扩展至 jframe 更改为 jpanel。我没有使用任何摇摆代码生成器...就像我说的编程菜鸟一样,只需很少的帮助就可以掌握它:(除了这里的人:)谢谢你的帮助:)
  • @YouSof:关于“不使用 Swing 代码生成器”——对你有好处!在学习 Swing 后,我完全赞成使用它们,但在这个阶段避免它们是正确的。
  • 我的计划是将服务器类更改为 jpanel,然后将客户端类保持为扩展 JFrame。但是我如何将服务器中的 jpanel 添加到客户端的框架中?大声笑希望这是有道理的
  • @YouSof:我强烈建议您创建并发布minimal compilable and runnable example program。让我们不要乱用这些没有人可以运行或测试的代码 sn-ps。这需要您付出认真的努力,但如果您需要认真的帮助,那么这就是您要走的路。请务必完整阅读链接以了解此工具的要求。
  • @YouSof:那么你需要找其他人来帮助你。如果您需要我的帮助,请尊重我的时间限制,因为我们志愿者中很少有人(一个重要的词和概念)有空闲时间完成一个完整的计划。同样,如果您需要我们的帮助,请阅读链接并尝试创建一个最小示例。
猜你喜欢
  • 2014-10-13
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多