当前位置: 首页 > 知识库问答 >
问题:

JFrame上的Swing图形

钱毅
2023-03-14

使用Java图形,我试图画一个简单的矩形。

作为Applet它运行良好,但当我使用它在JFrame上显示时,矩形来了,但有一些不寻常的背景

这是编码:

package graphicsex;

import java.awt.Graphics;

public class Graphics2 extends javax.swing.JFrame {

    public static void main(String[] args) {
        Graphics2 inst = new Graphics2();
        inst.setVisible(true);
    }

    public Graphics2() {
        super();
        initGUI();
    }

    private void initGUI() {
        try {
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            pack();
            setSize(400, 300);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void paint(Graphics g) {
        g.drawRect(10, 20, 30, 40);
    }
}

然后我尝试使用JTextArea使用这两个类,但在这种情况下,矩形根本不显示。

GraphicsEx1.java:

package graphicsex;

import javax.swing.JTextArea;
import java.awt.Graphics;

public class GraphicsEx1 extends javax.swing.JFrame {

    private JTextArea jTextArea1;

    {
        //Set Look & Feel
        try {
            javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        GraphicsEx1 inst = new GraphicsEx1();
        inst.setVisible(true);
    }

    public GraphicsEx1() {
        super();
        initGUI();
    }

    private void initGUI() {
        try {
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            getContentPane().setLayout(null);
            {
                jTextArea1 = new JTextArea();
                getContentPane().add(jTextArea1);
                jTextArea1.setBounds(7, 7, 371, 245);
                jTextArea1.setEnabled(false);
            }
            pack();
            setSize(400, 300);
        } catch (Exception e) {
            e.printStackTrace();
        }
        postInitGUI();
    }

    public void postInitGUI() {
        DisplayItems dp = new DisplayItems();
        jTextArea1 = dp;
        dp.setVisible(true);
        this.add(jTextArea1);
    }
}

和DisplayItems。java:

package graphicsex;

import java.awt.Dimension;
import java.awt.Graphics;

public class DisplayItems extends javax.swing.JTextArea {

    public DisplayItems() {
        super();
        initGUI();
    }

    private void initGUI() {
        try {
            setPreferredSize(new Dimension(400, 300));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void paint(Graphics g) {
        g.drawRect(10, 20, 50, 100);
        g.drawString("Kalai", 90, 150);
    }
}

任何人都可以帮助我在任何摆动容器上显示图形组件,例如JFrame、JPanelJTextArea'等。

共有2个答案

汪驰
2023-03-14

*使用jPanel*

使用jpanel可以绘制图形元素;

import java.awt.Graphics;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;

public class GraphicsEx1 extends javax.swing.JFrame {
private JScrollPane jsp1;
private JTextArea jta1;
private JPanel jpnl1;

{
//Set Look & Feel
try {
javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
} catch(Exception e) {e.printStackTrace();}
}

public static void main(String[] args) {
GraphicsEx1 inst = new GraphicsEx1();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}

public GraphicsEx1() {
super();
initGUI();
postInitGUI();
}

private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
{
jsp1 = new JScrollPane();
getContentPane().add(jsp1);
jsp1.setBounds(10, 32, 372, 223);
{
jpnl1 = new JPanel();    //<----------------
jsp1.setViewportView(jpnl1);    //<----------------
jpnl1.setBackground(new java.awt.Color(255,255,255));
jpnl1.setLayout(null);
//jpnl1.setPreferredSize(new java.awt.Dimension(359, 327));
}
}
pack();
setSize(400, 300);
} catch (Exception e) {e.printStackTrace();}
}

public void postInitGUI(){
frmGrpView gp=new frmGrpView();
jta1=new JTextArea();
jta1=gp;
jta1.setBounds(0,0, 336, 197);
jta1.setVisible(true);
//jpnl1.setBounds(0, 0, 336, 197);
jpnl1.add(jta1);    //<----------------
jpnl1.revalidate();
jsp1.revalidate();
}
}
//----------------------- Second Class --------------------------
class frmGrpView extends JTextArea{
public frmGrpView() {
super();
setEditable(false);
}
public void paint(Graphics g){
super.paint(g);
g.drawRect(10, 10, 100, 100);
}
}
谢财
2023-03-14

不建议覆盖顶层容器的绘制方法。。。

JFrame包含许多重要的层,其中放置了许多其他组件,购买这样做...

public void paint(Graphics g){
    g.drawRect(10,20,30,40);
}

您已经成功地阻止了任何子组件从开始绘制,或者事实上,除了您的矩形之外的任何东西。

(顶级秋千容器的秘密生活-图片取自如何使用根窗格)

虽然有些人可能会建议简单地添加super.paint(g)的调用,但我不推荐这样做。

最好使用类似JFrame的玻璃窗格。。。这将允许您在位于框架内的组件上绘制。如果需要在组件下绘制,请替换JFrame的内容窗格。

你可能会发现。。。

  • 表演定制绘画

的使用...

更新

我想我开始发现你在文本区域上进行自定义绘制的问题了。

问题是,paintComponent在一次糟糕的猛扑中绘制背景和文本,这意味着在调用super之前所做的任何绘制。paintComponent将被渲染,但在其上进行的任何绘制都将在文本上绘制。

您可以将文本区域设置为非不透明,然后自己绘制背景。。。

public class CustomTextArea extends JTextArea {

    public CustomTextArea() {
        setOpaque(false);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(getBackground());
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.RED);
        g.fillRect(0, 0, 100, 100);
        super.paintComponent(g);
    }

}

但问题是,人们很容易停留在不透明的层面上,破坏你的工作。当然,您可以覆盖setOpaque或getOpaque,但您如何知道用户何时真正想要将组件设置为透明,以便停止填充背景?

 类似资料:
  • 问题内容: 如何获得的? 我想获取的屏幕截图(以供以后在我的应用程序中使用)。目前,这是通过使用机器人进行截屏来指定相关对象的坐标和尺寸来完成的。 但是,我相信有一种更好的方法:默认情况下,组件在将其自身绘制到屏幕上之前,将它们自己作为图像呈现到双缓冲区中。 有没有办法从组件中获取这些图像? 问题答案: ComponentImageCapture.java 另见 上面显示的代码假定组件在渲染之前已

  • 问题内容: 我学习Java已有几周了,在将背景图像应用于JFrame时,我真的很困惑。我遇到的每个教程都不像我那样创建Frames(我扩展了JFrame),或者如果这样做,说明还不够清楚,我无法理解。 下面的代码来自我自己的项目,因此可以帮助我练习到目前为止所学的内容。请您能否以下面的代码为基础,并向我说明要添加的内容和位置,所以我可能以图像作为框架的背景? 我真正要感谢的一件事是,如果您能解释事

  • 问题内容: 我只是编写了一个简单的代码,希望在主框架上显示一个文本字段和一个按钮,但是运行全部后,我看到的是文本字段。 如果我在文本字段后编写按钮的代码,则仅显示按钮。 知道为什么吗? 问题答案: 将组件添加到JPanel,然后将该面板添加到JFrame的ContentPane。

  • 问题内容: 我无法在JFrame上绘制此椭圆形。 框架显示,但其中未绘制任何内容。我在这里做错了什么? 问题答案: 您创建了一个静态方法,该方法不会覆盖paint方法。现在,其他人已经指出,您需要覆盖paintComponent等。但是,为了快速修复,您需要执行以下操作: 但是,正如其他人指出的那样,在JFrame上进行绘制非常棘手。最好使用JPanel。

  • 问题内容: 我有一个框架,并想在用户关闭它时提示以保存文档。但是,如果它们取消,则框架不应关闭。 FileState查看文档是否脏了。如果不是,则不执行任何操作并返回true。如果脏了,它会询问用户是否要保存(是/否/取消)。如果用户此时取消,则应中止windowClosing。 我在网上看到的所有建议都涉及显式退出windowClosing方法,从而覆盖JFrame.setDefaultClos

  • 问题内容: 我有一个给定的,我想将其显示(插入)到的中,但这不可能像这样明确地实现: 错误是: 我尝试了一些解决方案,例如将框架插入,但徒劳无功。我有将其转换为的想法,但是对此我一无所知。 那是插入的任何解决方案吗? 更新 : 我尝试过这种解决方案: 但是我丢失了我添加的内容。 问题答案: 您不能将(或另一个顶级组件)添加到另一个组件/容器,但是可以使用框架方法来获取框架的主面板并将其添加到选项卡