java - 用 Java 显示 GUI 组件

标签 java user-interface graphics jframe

我有一个使用 Netbeans 创建的 GUI 窗口。然后我将代码移植到我自己的程序中,以便我可以随意显示 .png。

但是,GUI 组件不会显示,并且默认情况下打开的窗口没有大小。

我需要窗口最初打开时 GUI 组件可见,并且窗口大小正确以使所有内容都可见。

谁能帮帮我吗?

谢谢

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;

public class AwtImage extends javax.swing.JFrame {

    private Image img;

    // Variables declaration - do not modify                     
    private javax.swing.JCheckBox jCheckBox2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration            

    public static void main(String[] args){
        AwtImage ai = new AwtImage();
    }

    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTextField1 = new javax.swing.JTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jCheckBox2 = new javax.swing.JCheckBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Not Logged In");
        getContentPane().setLayout(null);

        jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                jTextField1KeyTyped(evt);
            }
        });
        jScrollPane1.setViewportView(jTextField1);

        getContentPane().add(jScrollPane1);
        jScrollPane1.setBounds(0, 540, 170, 22);

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane2.setViewportView(jTextArea1);

        getContentPane().add(jScrollPane2);
        jScrollPane2.setBounds(0, 440, 166, 96);

        jCheckBox2.setText("Sit Out Next Hand");
        jCheckBox2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBox2ActionPerformed(evt);
            }
        });
        getContentPane().add(jCheckBox2);
        jCheckBox2.setBounds(0, 410, 113, 23);

        pack();
    }// </editor-fold>


    private void jCheckBox2ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
    }                                          

    private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {                                     
        // TODO add your handling code here:
    }               



    public AwtImage() {
        super("Image Frame");
        MediaTracker mt = new MediaTracker(this);
        img = Toolkit.getDefaultToolkit().getImage("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\TableAndChairs.png");
        mt.addImage(img,0);
        setSize(600,600);


        initComponents();
        setVisible(true);
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent we) {
                dispose();
            }
        });
    }

    public void update(Graphics g){
        paint(g);
    }

    public void paint(Graphics g) {
        if(img != null)
            g.drawImage(img, 0, 10, this);
       // else
        //    g.clearRect(0, 0, getSize().width, getSize().height);
    }
}

alt text http://img41.imageshack.us/img41/9795/openn.png alt text http://img709.imageshack.us/img709/5716/uponresize.png

最佳答案

代码存在几个问题。

除了使用 pack() 或在将组件添加到框架“之后”以及调用 setVisible(true) 方法之前设置框架大小的其他建议之外,您还需要查看以下内容。

该代码基于旧的 AWT 绘画技术,不应与 Swing 一起使用。您永远不应该重写 JFrame 的 update() 或 Paint() 方法。子组件未绘制的原因是 Paint() 方法负责绘制它们,但您覆盖了此默认行为。

使用 Swing 时,自定义绘制是通过重写 JComponent 或 JPanel 的 PaintComponent() 方法来完成的,然后将此组件添加到框架的内容 Pane 中。阅读 Swing 教程中关于 Custom Painting 的部分了解更多信息和工作示例。本教程的关键点之一是为组件提供首选尺寸,以便布局管理器可以正确布局它。

您不应该使用 KeyListener。同样,这是一种古老的 AWT 技术。 Swing 现在使用键绑定(bind)将 KeyStrokes 映射到操作。请阅读 Swing 教程中有关“如何使用键绑定(bind)”的部分以获取更多信息。

您不应该使用 WindowListener 再次关闭框架,这是一种旧的 AWT 技术。 Swing 应用程序现在使用frame.setDefaultCloseOperation(...) 方法来控制它。

“如何使用图标”教程部分向您展示了加载图像的更简单方法。

所以总的来说,我建议您首先下载 Swing 教程来学习 Swing 编程技术。本教程涵盖了基础知识和许多简单的示例,可帮助您入门。

关于java - 用 Java 显示 GUI 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1935057/

相关文章:

java - 如何使用 App Engine 获取静态 URL

user-interface - 游戏界面HUD

JavaFX - StackPane 组件跳转

android - 从对话框中删除边框,填充

ios - 跨多个 MTKViews 共享一个 MTLCommandBuffer

java - 'mix class and interfaces in the same package' 是不好的做法吗?

java - Spring框架升级到5

java - 从图形对象获取 X 和 Y 坐标

java - 在Java中,如何防止图形Applet多次运行?

java - Alfresco 中的方面名称在 'Manage Aspect' 中显示为未定义