问一个关于Swing的问题,不知道还有没有人在用!

Sky丶凌风 2018-04-08 10:35:13
我用Popup弹出一个窗口Jpanel,上面加了一个JtextArea。但是点击标签后,弹出来的窗口,是无法获取焦点的,就是text不能辩解,请问,各位大佬,怎么解决,这个问题呢,或者说,怎么实现这样的弹窗。谢谢
...全文
245 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sky丶凌风 2018-04-08
  • 打赏
  • 举报
回复
代码如下:


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;



public class TextModel extends JPanel {

	private static final long serialVersionUID = 4529266044762990227L;

	private Calendar select;

	private JPanel TextPanel;

	private Font font = new Font("宋体", Font.PLAIN, 12);

	private SimpleDateFormat sdf;

	private boolean isShow = false;

	private Popup pop;

	private JComponent showDate;

	private TextModel() {
		select = Calendar.getInstance();
		initPanel();

	}

	/**
	 * 
	 * 是否允许用户选择
	 * 
	 */

	public void setEnabled(boolean b) {

		super.setEnabled(b);

		showDate.setEnabled(b);
	}

	/**
	 * 得到当前选择框
	 */

	public Date getDate() {

		return select.getTime();

	}

	public String getStrDate() {
		return sdf.format(select.getTime());
	}

	public String getStrDate(String format) {
		sdf = new SimpleDateFormat(format);
		return sdf.format(select.getTime());
	}
	// 根据初始化的,初始化面板

	private void initPanel() {

		TextPanel = new JPanel(new BorderLayout());
		TextPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
		JPanel jp1 = new JPanel(new BorderLayout());
		jp1.setBackground(new Color(160, 185, 215));
		JLabel title = new JLabel("补充条款:", JLabel.CENTER);
		title.setFont(font);
		title.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
		jp1.setPreferredSize(new Dimension(175, 25));
		jp1.add(title);
		
		TextPanel.add(jp1, BorderLayout.NORTH);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPane.setPreferredSize(new Dimension(175, 100));
		TextPanel.add(scrollPane, BorderLayout.CENTER);

		final JTextArea textArea = new JTextArea();
		textArea.setLineWrap(true);
		textArea.grabFocus();
		scrollPane.setViewportView(textArea);

		JPanel jp3 = new JPanel(new BorderLayout());
		jp3.setPreferredSize(new Dimension(175, 20));
		jp3.setBackground(new Color(160, 185, 215));
		final JLabel jl = new JLabel("OK");
		jl.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println("!!!!");
				textArea.grabFocus();
				textArea.requestFocusInWindow();
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			}

			@Override
			public void mouseExited(MouseEvent e) {
				setCursor(Cursor.getDefaultCursor());
			}

			@Override
			public void mousePressed(MouseEvent e) {
				jl.setForeground(Color.RED);
			}

			@Override
			public void mouseReleased(MouseEvent e) {
				jl.setForeground(Color.BLUE);
			}
		});
		jl.setHorizontalAlignment(SwingConstants.CENTER);
		jl.setFont(font);
		jp3.add(jl, BorderLayout.CENTER);
		TextPanel.add(jp3, BorderLayout.SOUTH);

		this.addAncestorListener(new AncestorListener() {
			// 只要祖先组件一移动,马上就让popup消失
			public void ancestorMoved(AncestorEvent event) {
				hidePanel();
			}

			@Override
			public void ancestorAdded(AncestorEvent event) {
			}

			@Override
			public void ancestorRemoved(AncestorEvent event) {
			}

		});

	}

	public void register(final JComponent showDate) {

		this.showDate = showDate;

		showDate.setRequestFocusEnabled(true);

		showDate.addMouseListener(new MouseAdapter() {

			public void mousePressed(MouseEvent me) {

				showDate.requestFocusInWindow();

			}

		});

		this.setBackground(Color.WHITE);

		this.add(showDate, BorderLayout.CENTER);

		this.setPreferredSize(new Dimension(90, 25));

		this.setBorder(BorderFactory.createLineBorder(Color.GRAY));

		showDate.addMouseListener(new MouseAdapter() {

			public void mouseEntered(MouseEvent me) {

				if (showDate.isEnabled()) {

					showDate.setCursor(new Cursor(Cursor.HAND_CURSOR));

					showDate.setForeground(Color.RED);

				}

			}

			public void mouseExited(MouseEvent me) {

				if (showDate.isEnabled()) {

					showDate.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

					showDate.setForeground(Color.BLACK);
				}

			}

			public void mousePressed(MouseEvent me) {

				if (showDate.isEnabled()) {

					showDate.setForeground(Color.CYAN);

					if (isShow) {
						hidePanel();
					} else {
						showPanel(showDate);
					}

				}

			}

			public void mouseReleased(MouseEvent me) {

				if (showDate.isEnabled()) {

					showDate.setForeground(Color.BLACK);

				}

			}

		});

		showDate.addFocusListener(new FocusListener() {

			public void focusLost(FocusEvent e) {

				hidePanel();

			}

			public void focusGained(FocusEvent e) {

			}

		});

	}

	// 隐藏选择面板

	private void hidePanel() {

		if (pop != null) {

			isShow = false;

			pop.hide();

			pop = null;

		}

	}

	// 显示选择面板

	private void showPanel(Component owner) {

		if (pop != null) {

			pop.hide();

		}

		Point show = new Point(0, showDate.getHeight());

		SwingUtilities.convertPointToScreen(show, showDate);

		Dimension size = Toolkit.getDefaultToolkit().getScreenSize();

		int x = show.x;

		int y = show.y;

		if (x < 0) {

			x = 0;

		}

		if (x > size.width - 175) {

			x = size.width - 175;

		}

		if (y < size.height - 170) {

		} else {

			y -= 188;

		}

		pop = PopupFactory.getSharedInstance().getPopup(owner, TextPanel, x, y);

		pop.show();

		isShow = true;

	}


	public static void main(String[] args) {

		TextModel dateChooser1 = new TextModel();

		TextModel dateChooser2 = new TextModel();

		JTextField showDate1 = new JTextField("单击选择");

		JLabel showDate2 = new JLabel("单击选择");

		dateChooser1.register(showDate1);

		dateChooser2.register(showDate2);

		JFrame jf = new JFrame("测试选择器");

		jf.getContentPane().add(showDate1, BorderLayout.NORTH);

		jf.getContentPane().add(showDate2, BorderLayout.SOUTH);

		jf.pack();

		jf.setLocationRelativeTo(null);

		jf.setVisible(true);

		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

}

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧