获取一个 JTextField 回到透明状态
Get a JTextFeild to go back to a transparent state
我试图在单击按钮时让 JTextField
显示在 JButton
之上。我有那个工作,但是当我点击按钮时它仍然保持可见。我正在使用 MouseListener
事件,所以一旦我退出按钮,我希望 JTextField
再次变得透明,但它仍然可见。
我的代码:
import java.awt.EventQueue;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseEvent;
public class magicalJtextField extends JFrame implements MouseListener{
private JPanel contentPane;
private JTextField textField;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
magicalJtextField frame = new magicalJtextField();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public magicalJtextField() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
textField = new JTextField();
textField.setBounds(78, 78, 89, 30);
contentPane.add(textField);
textField.setColumns(10);
JButton button = new JButton("");
//button transparent
// button.setOpaque(false);
// button.setContentAreaFilled(false);
// button.setBorderPainted(false);
button.setBounds(78, 78, 89, 23);
button.addMouseListener(this);
contentPane.add(button);
textField.setVisible(false);
}
public void mouseEntered(MouseEvent e)
{
//button.setText("Mouse Entered");
//button.setBackground(Color.CYAN);
// textField.setVisible(true);
}
public void mouseExited(MouseEvent e)
{
textField.setVisible(false);
}
public void mouseClicked(MouseEvent e)
{
textField.setVisible(true);
}
public void mousePressed(MouseEvent e)
{
textField.setVisible(true);
}
public void mouseReleased(MouseEvent e)
{
textField.setVisible(true);
}
}
使用 ActionListener
对按钮点击作出反应:如果您收到点击,请将按钮设为不可见,将 textField 设为可见。
然后将 MouseListener
附加到 textField 而不是按钮,并且只实现 mouseExited
(所有其他为空)。当您收到此事件时,使 textField 不可见并再次显示按钮。
我建议 CardLayout
用于 Jbutton
-JTextField
魔术(编辑:我实际上是在发布后才在评论中看到的建议,因为它非常明显并且在答案)。按下按钮将切换卡片,然后用鼠标退出文本字段区域将再次切换。
public class Example extends JPanel {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame frame = new JFrame();
frame.add(new Example());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
});
}
public Example() {
CardLayout cards = new CardLayout(5, 5);
JPanel panel = new JPanel(cards);
JButton button = new JButton("");
JTextField textField = new JTextField(10);
button.addActionListener(e -> {
cards.next(panel);
textField.requestFocusInWindow();
});
textField.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
cards.next(panel);
}
});
panel.add(button);
panel.add(textField);
add(panel);
}
}
正如 告诉您的那样,不要使用 null
布局并且不要指定边界。使用适当的布局管理器为您完成此操作。
我试图在单击按钮时让 JTextField
显示在 JButton
之上。我有那个工作,但是当我点击按钮时它仍然保持可见。我正在使用 MouseListener
事件,所以一旦我退出按钮,我希望 JTextField
再次变得透明,但它仍然可见。
我的代码:
import java.awt.EventQueue;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseEvent;
public class magicalJtextField extends JFrame implements MouseListener{
private JPanel contentPane;
private JTextField textField;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
magicalJtextField frame = new magicalJtextField();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public magicalJtextField() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
textField = new JTextField();
textField.setBounds(78, 78, 89, 30);
contentPane.add(textField);
textField.setColumns(10);
JButton button = new JButton("");
//button transparent
// button.setOpaque(false);
// button.setContentAreaFilled(false);
// button.setBorderPainted(false);
button.setBounds(78, 78, 89, 23);
button.addMouseListener(this);
contentPane.add(button);
textField.setVisible(false);
}
public void mouseEntered(MouseEvent e)
{
//button.setText("Mouse Entered");
//button.setBackground(Color.CYAN);
// textField.setVisible(true);
}
public void mouseExited(MouseEvent e)
{
textField.setVisible(false);
}
public void mouseClicked(MouseEvent e)
{
textField.setVisible(true);
}
public void mousePressed(MouseEvent e)
{
textField.setVisible(true);
}
public void mouseReleased(MouseEvent e)
{
textField.setVisible(true);
}
}
使用 ActionListener
对按钮点击作出反应:如果您收到点击,请将按钮设为不可见,将 textField 设为可见。
然后将 MouseListener
附加到 textField 而不是按钮,并且只实现 mouseExited
(所有其他为空)。当您收到此事件时,使 textField 不可见并再次显示按钮。
我建议 CardLayout
用于 Jbutton
-JTextField
魔术(编辑:我实际上是在发布后才在评论中看到的建议,因为它非常明显并且在答案)。按下按钮将切换卡片,然后用鼠标退出文本字段区域将再次切换。
public class Example extends JPanel {
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame frame = new JFrame();
frame.add(new Example());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
});
}
public Example() {
CardLayout cards = new CardLayout(5, 5);
JPanel panel = new JPanel(cards);
JButton button = new JButton("");
JTextField textField = new JTextField(10);
button.addActionListener(e -> {
cards.next(panel);
textField.requestFocusInWindow();
});
textField.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
cards.next(panel);
}
});
panel.add(button);
panel.add(textField);
add(panel);
}
}
正如 null
布局并且不要指定边界。使用适当的布局管理器为您完成此操作。