【问题标题】:Error with java text areasjava文本区域出错
【发布时间】:2015-01-25 19:32:20
【问题描述】:

我的 JText 区域不工作。您将看到是否运行此代码。即使我已经设置了一个明确的位置,textArea 也会不断地去不同的地方。 textArea 的代码是第 57 行。

我真正需要的是让 testArea 保持一个固定的位置,这在第 57 行进行了解释。

注意:'pain' 是一个包含 textArea 的 JPanel

public Graphics g;

public void paint(Graphics g) {

    Graphics2D projectFinder = (Graphics2D) g;
    projectFinder.setColor(Color.GRAY);
    projectFinder.fillRect(0, 0, 1000, 50);
    projectFinder.setStroke(new BasicStroke(100));

    Graphics2D OutPut = (Graphics2D) g;
    OutPut.setColor(Color.LIGHT_GRAY);
    OutPut.fillRect(553, 60, 535, 670);
    OutPut.drawString("Project Input (Your Code)", 30, 90);

    Graphics2D console = (Graphics2D) g;
    console.setColor(Color.WHITE);
    console.fillRect(563, 620, 515, 100);

    console.setColor(Color.BLACK);
    console.drawString("Console.ChemLOG", 570, 640);

}

public static void main(String[] args) {

    JPanel pnlButton = new JPanel();
    pnlButton.setBounds(800, 100, 100, 100);

    JButton button = new JButton("Add Project");
    button.setBounds(1000, 0, 100, 50);

    JFrame frame = new JFrame("GenoTECH IDE 1.0.0");
    frame.add(new MainScreen());
    frame.setSize(1100, 800);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(button);
    button.addActionListener(new NewProject());

    // TextBox

    JPanel pain = new JPanel();
    JTextArea area = new JTextArea();
    area.setSize(535, 670);
    area.setLocation(0, 0);

    pain.setLocation(10, 60);
    pain.setSize(area.getSize());

    pain.add(area);

    frame.add(pain);
}

// add project button
static class NewProject implements ActionListener {
    public void actionPerformed(ActionEvent e) {

        JButton buttonOK = new JButton("Ok");
        buttonOK.setBounds(0, 233, 150, 45);

        JButton buttonCn = new JButton("Cancel");
        buttonCn.setBounds(150, 233, 150, 45);

        JFrame frame2 = new JFrame("New Project");
        frame2.setSize(300, 300);
        frame2.setVisible(true);
        frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame2.add(buttonOK);
        frame2.add(buttonCn);
        buttonCn.addActionListener(new buttonCN());

    }

    static class buttonCN implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            System.exit(0);

        }
    }
}

}

好的,现在更新代码,我已经让 JTextArea 正常工作,但由于某种原因没有调用 2D 图形。我还在使用一些 Java 布局格式进行另一种布局。

新代码:

private static final long serialVersionUID = 1L;
public Graphics g;

public void paint(Graphics g) {

    Graphics2D projectFinder = (Graphics2D) g;
    projectFinder.setColor(Color.GRAY);
    projectFinder.fillRect(0, 0, 1000, 50);
    projectFinder.setStroke(new BasicStroke(100));

    Graphics2D OutPut = (Graphics2D) g;
    OutPut.setColor(Color.LIGHT_GRAY);
    OutPut.fillRect(553, 60, 535, 670);
    OutPut.drawString("Project Input (Your Code)", 30, 90);

    Graphics2D console = (Graphics2D) g;
    console.setColor(Color.WHITE);
    console.fillRect(563, 620, 515, 100);

    console.setColor(Color.BLACK);
    console.drawString("Console.ChemLOG", 570, 640);

}

public static void main(String[] args) {        
    JButton button = new JButton("Add Project");
    button.setBounds(1000, 0, 100, 50);
    //button.setSize(5,5);
    //button.setLocation(1,1);

    JFrame frame = new JFrame("GenoTECH IDE 1.0.0");
    frame.setLayout(null);
    frame.add(new MainScreen());
    frame.setSize(1100, 800);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(button);
    button.addActionListener(new NewProject());

    // Thing to Change
    JTextArea area = new JTextArea();
    area.setSize(535, 670);
    area.setLocation(10, 60);

    frame.add(area);
}


// add project button
static class NewProject implements ActionListener {
    public void actionPerformed(ActionEvent e) {

        JButton buttonOK = new JButton("Ok");
        buttonOK.setBounds(0, 233, 150, 45);

        JButton buttonCn = new JButton("Cancel");
        buttonCn.setBounds(150, 233, 150, 45);

        JFrame frame2 = new JFrame("New Project");
        frame2.setSize(300, 300);
        frame2.setVisible(true);
        frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame2.add(buttonOK);
        frame2.add(buttonCn);
    }
}

【问题讨论】:

  • 每次运行它时它是否出现在不同的位置(即,它是否在您运行程序时立即发生)或者是否必须发生某些事情才能发生这种行为?
  • 使用布局管理器而不是硬编码边界和尺寸。 docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
  • 虽然空布局和setBounds() 对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但创建的 Swing GUI 越多,使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整您的组件大小,它们是增强或维护的皇家女巫,放置在滚动窗格中时它们完全失败,在与原始不同的所有平台或屏幕分辨率上查看时它们看起来很糟糕.
  • "Swing 程序应该覆盖paintComponent(),而不是覆盖paint()。"—Painting in AWT and Swing: The Paint Methods
  • 但是解决方案已经给你了:不要设置边界,不要使用空布局和绝对定位。而是以聪明的方式使用布局管理器,如果您遵循这些建议,您的代码将富有成效,您将获得成功。

标签: java swing layout-manager null-layout-manager


【解决方案1】:

我不确定你想做什么。这是带有 Swing 布局的代码的可运行版本。

这是我所做的更改。

  1. 我通过调用 SwingUtilities invokeLater 方法启动了应用程序。这可确保在 Event Dispatch thread (EDT) 上创建和修改 Swing 组件。

  2. 执行 JFrame 方法的顺序非常重要。我修好了订单。

  3. 您使用paintComponent 方法在JPanel 上绘图。您必须在绘制代码之前调用 super。

  4. 您只设置绘图面板的大小。您可以使用 JFrame pack 方法来调整其余 Swing 组件的大小。

  5. 正如其他人所提到的,您使用Swing layouts 来布置 Swing 组件。

.

package com.ggl.testing;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class GenoTech implements Runnable {

    @Override
    public void run() {
        JFrame frame = new JFrame("GenoTECH IDE 1.0.0");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));

        mainPanel.add(new DrawingPanel());

        JPanel pnlButton = new JPanel();

        JButton button = new JButton("Add Project");
        button.addActionListener(new NewProjectActionListener());
        pnlButton.add(button);

        mainPanel.add(pnlButton);

        JPanel pain = new JPanel();
        JTextArea area = new JTextArea();
        pain.add(area);

        mainPanel.add(pain);

        frame.add(mainPanel);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new GenoTech());
    }

    public class DrawingPanel extends JPanel {

        private static final long serialVersionUID = -5718559965267054844L;

        public DrawingPanel() {
            this.setPreferredSize(new Dimension(700, 300));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g;
            g2d.setColor(Color.GRAY);
            g2d.fillRect(0, 0, 700, 50);
            g2d.setStroke(new BasicStroke(100));

            g2d.setColor(Color.LIGHT_GRAY);
            g2d.fillRect(553, 60, 535, 300);
            g2d.drawString("Project Input (Your Code)", 30, 90);

            g2d.setColor(Color.WHITE);
            g2d.fillRect(563, 620, 515, 100);

            g2d.setColor(Color.BLACK);
            g2d.drawString("Console.ChemLOG", 570, 640);
        }

    }

    // add project button
    public class NewProjectActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            JFrame frame2 = new JFrame("New Project");
            frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

            JPanel mainPanel = new JPanel();

            JButton buttonOK = new JButton("Ok");
            mainPanel.add(buttonOK);

            JButton buttonCn = new JButton("Cancel");
            buttonCn.addActionListener(new ButtonCNActionListener());
            mainPanel.add(buttonCn);

            frame2.add(mainPanel);
            frame2.pack();
            frame2.setLocationByPlatform(true);
            frame2.setVisible(true);
        }

        public class ButtonCNActionListener implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        }
    }

}

【讨论】:

  • 好的,我明白你做了什么,但是我不认为它安静地解决了问题。我用你的代码清理了我的一些部分,但我的主要问题是 JTextArea,当你输入它时,它会搞砸并转到屏幕顶部。您的代码并没有完全解决这个问题,但感谢您的建议。我将尝试使用布局来解决这个问题,我正在努力解决这个问题。
  • @RadékMartinez:如果这个答案对您有任何帮助,请至少投票。如果它回答了您的问题,请接受它。请查看What should I do when someone answers my question? 了解更多关于本网站最佳行为的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2014-06-06
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多