【发布时间】:2015-07-13 08:16:56
【问题描述】:
我一直在尝试将诸如 textField 和 passwordField 之类的 Java 表单元素添加到全屏独占模式框架中。我遇到的问题是,当我运行代码时,我的表单元素在我实际点击它们之前不会完全显示或根本不显示。
这是我的代码:
Master.java
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
public class Master extends JFrame {
private static final long serialVersionUID = -4927941474660261348L;
static GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
static GraphicsDevice gd = ge.getDefaultScreenDevice();
static int WIDTH = gd.getDisplayMode().getWidth();
static int HEIGHT = gd.getDisplayMode().getHeight();
static Toolkit toolkit = Toolkit.getDefaultToolkit();
static Graphics2D g2d = null;
static FontMetrics metrics = null;
static URL vignetteURL = null;
static Image vignette = null;
static Rectangle red = new Rectangle(WIDTH - 35, 0, 35, 35);
public Master() {
super("Project Zenith");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
getContentPane().setLayout(null);
setUndecorated(true);
setResizable(false);
gd.setFullScreenWindow(this);
repaint();
setIconImage(new ImageIcon(getClass().getResource("images/hex.png")).getImage());
vignetteURL = getClass().getResource("images/vignette2.png");
addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
if(e.getX() >= red.getX() && e.getY() <= red.getHeight()) {
closeClicked();
}
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
}
@Override
public void mouseReleased(MouseEvent arg0) {
}
});
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
g2d = (Graphics2D) g;
vignette = toolkit.getImage(vignetteURL);
g2d.clearRect(0, 0, getWidth(), getHeight());
g2d.setFont(new Font("Bebas Neue", Font.PLAIN, 25));
metrics = g2d.getFontMetrics();
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setColor(new Color(168, 168, 168, 200));
g2d.drawString("Project Zenith", 10, HEIGHT - 10);
g2d.setColor(new Color(0xFFA6A6));
g2d.fill(red);
g2d.drawImage(vignette, 0, 0, WIDTH, HEIGHT, this);
}
public void closeClicked() {
System.exit(0);
}
}
登录.java
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.RoundRectangle2D;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Login extends Master {
private static final long serialVersionUID = 1L;
static Master l;
static JTextField username;
static JTextField password;
static Graphics2D g2d = null;
static FontMetrics metrics = null;
static RoundRectangle2D loginRect = new RoundRectangle2D.Float((WIDTH / 2) - ((WIDTH / 4) / 2), (HEIGHT / 2) - ((HEIGHT / 4) / 2), (WIDTH / 4), (HEIGHT / 4), 20, 20);
Login() {
l = this;
Font inputFont = new Font("Calibri", Font.PLAIN, 15);
username = new JTextField();
username.setBounds((WIDTH / 2) - (((int) loginRect.getY() - 10) / 2), (int) loginRect.getY() + 60, (int) loginRect.getY() - 10, 18);
username.setFont(inputFont);
username.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
username.setEditable(true);
username.setBackground(new Color(0xE6E6E6));
//username.setVisible(true);
getContentPane().add(username);
password = new JPasswordField();
password.setBounds((WIDTH / 2) - (((int) loginRect.getY() - 10) / 2), (int) loginRect.getY() + 110, (int) loginRect.getY() - 10, 18);
password.setFont(inputFont);
password.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
password.setEditable(true);
password.setBackground(new Color(0xE6E6E6));
//password.setVisible(true);
getContentPane().add(password);
JButton loginButton = new JButton("Login");
loginButton.setBounds((WIDTH / 2) - 40, (int) loginRect.getY() + 155, 80, 20);
loginButton.setFont(inputFont);
loginButton.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
loginButton.setBackground(new Color(0xE6E6E6));
//loginButton.setVisible(true);
loginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(username.getText());
}
});
getContentPane().add(loginButton);
repaint();
setVisible(true);
}
public void paint(Graphics g) {
super.paint(g);
g2d = (Graphics2D) g;
metrics = g2d.getFontMetrics();
g2d.setColor(Color.WHITE);
g2d.fill(loginRect);
g2d.setColor(new Color(0xA8A8A8));
g2d.drawString("Access Terminal", (Master.WIDTH / 2) - (metrics.stringWidth("Access Terminal") / 2), (int) loginRect.getY() + metrics.getHeight() + 2);
}
public static void main(String [] args) {
new Login();
}
}
【问题讨论】:
-
不要覆盖顶级容器的
update或paint。通过调用super.paint,确保您维护油漆链的完整性。避免使用null布局,像素完美的布局是现代 ui 设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正 -
在尚未显示在屏幕上的组件上调用
repaint没有意义 -
static不是您的朋友,它不是您启用跨对象通信的一种方式,而是一种让您在脚下开枪并想知道自己为什么一瘸一拐的方式... -
@MadProgrammer,你介意扩展一点吗?你会建议改变什么?
-
“你建议改变什么?” - 一切。
paint绘制在其他所有事物的顶部,您应该使用JPanel并覆盖它的paintComponent方法在子组件下绘制。使用适当的布局管理器
标签: java forms user-interface graphics elements