最近做一个 Jframe 的小程序,是关于文件上传下载的,碰到了一些小问题,记录一下吧。
说实话,拿 Jframe 做画面,真是蛋疼,坐标需要一点点调,也没个预览啥的,只能调完后运行才能看到效果,而且更操蛋的是调试时看着画面挺好,结果导出后打包成 exe,安装后的画面和自己调试的差距甚远,真是无语,见下图:
其它一些开发中碰到的问题,大概在这里记录一下,主要有一下几点。
1.如何修改Jframe画面左上角的小图标?
- 方法一:
- JFrame f = new JFrame();
- f.setIconImage(ImageIO.read(new File("xxx.jpg")));
- 方法二:
- JFrame f = new JFrame();
- f.setVisible(true);
- ImageIcon icon = new ImageIcon("xxx.jpg");
- f.setIconImage(icon.getImage());
- 方法三:
- JFrame f = new JFrame();
- URL url = f.getClass().getResource("xxx.jpg");
- Image img = Toolkit.getDefaultToolkit().getImage(url);
- f.setIconImage(img);
- 方法四:
- JFrame f = new JFrame();
- Toolkit tk = Toolkit.getDefaultToolkit();
- Image image = tk.createImage("xxx.jpg");
- f.setIconImage(image);
注意到,不管用什么方法,Jframe中设置图标的函数是setIconImage(),几种方法,只是获取图片的方式有点儿差异。
2.如何修改Jframe画面最小化后,在电脑右下角的托盘图标,并添加右键菜单?
- if (SystemTray.isSupported()) {// 如果操作系统支持托盘
- tray();// 添加托盘图标
- }
- /**
- * 添加系统托盘图标
- */
- private void tray() {
- tray = SystemTray.getSystemTray(); // 获得本操作系统托盘的实例
- ImageIcon icon = new ImageIcon("xxx.png"); // 将要显示到托盘中的图标
- PopupMenu pop = new PopupMenu(); // 构造一个右键弹出式菜单
- MenuItem show = new MenuItem("打开");
- pop.add(show);
- trayIcon = new TrayIcon(icon.getImage(), "数据同步(双击还原)", pop);
- /**
- * 添加鼠标监听器,当鼠标在托盘图标上双击时,默认显示窗口
- */
- trayIcon.addMouseListener(new MouseAdapter() {
- public void mouseClicked(MouseEvent e) {
- if (e.getClickCount() == 2) { // 鼠标双击
- tray.remove(trayIcon); // 从系统的托盘实例中移除托盘图标
- setExtendedState(JFrame.NORMAL);
- setVisible(true); // 显示窗口
- toFront();
- }
- }
- });
- show.addActionListener(new ActionListener() { // 点击“显示窗口”菜单后将窗口显示出来
- public void actionPerformed(ActionEvent e) {
- tray.remove(trayIcon); // 从系统的托盘实例中移除托盘图标
- setExtendedState(JFrame.NORMAL);
- setVisible(true); // 显示窗口
- toFront();
- }
- });
- }
3.Jframe 打开后默认居于屏幕左上角,如何让 Jframe 居于屏幕中央?
- JFrame f = new JFrame();
- f.setLocationRelativeTo(null);//居于屏幕中央
4.如何让 Jframe 居于最上层?
- JFrame f = new JFrame();
- f.setAlwaysOnTop(true);//居于最上层
5.Jframe 还有哪些常用的设置?
- f.setTitle(title);//设置标题
- f.setSize(150, 200);//设置窗口大小
- f.setVisible(true);//显示窗口
- f.setResizable(false);//不让调整窗口大小
- f.setExtendedState(JFrame.ICONIFIED);//支持最小化
- //关闭窗口
- f.setVisible(false);
- f.setExtendedState(JFrame.DO_NOTHING_ON_CLOSE);
6.点击关闭窗口时,如何弹出警告提示框?
- //初始化添加监听
- addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- exit();
- }
- });
- /**
- * 关闭画面警告框
- */
- public void exit() {
- Object[] options = { "确定", "取消" };
- JOptionPane pane2 = new JOptionPane("真想退出吗?",
- JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION, null,
- options, options[1]);
- JDialog dialog = pane2.createDialog(this, "警告");
- dialog.setVisible(true);
- Object selectedValue = pane2.getValue();
- if (selectedValue == null || selectedValue == options[1]) {
- setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // 这个是关键
- } else if (selectedValue == options[0]) {
- setDefaultCloseOperation(EXIT_ON_CLOSE);
- }
- }
7.如何给 MyJTextArea 添加滚动条,并让滚动条自动跟随内容滚动?
- MyJTextArea textarea = new MyJTextArea(27, 48);
- JScrollPane j = new JScrollPane(textarea,
- JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
- JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
- textarea.setText("显示内容");
- textarea.setCaretPosition(textarea.getText().length());//滚动条自动跟随
8.如何让 MyJTextArea 中的内容显示指定的行数?
应该来说有对应函数才对,比如最多只让显示 10 行,那第十一行 append 时,把第一行删除,仍保留 10 行。可上网搜了一大圈,没找到。自己写了一个,先凑活用吧。
- public static void appendText(String text) {
- String tt = textarea.getText();//已有的字符串
- String tm = "";
- String[] str = null;
- if (tt != null && !"".equals(tt)) {
- str = tt.split(IniReader.RN);
- if (str.length >= Main.LOG_DISPLAY) {//配置文件中定义的显示条数
- str[0] = "";
- }
- }
- if (str != null) {
- for (int i = 0; i < str.length; i++) {
- if (!"".equals(str[i])) {
- tm += str[i] + IniReader.RN;
- }
- }
- }
- textarea.setText(tm);
- textarea.append(text + IniReader.RN);
- textarea.setCaretPosition(textarea.getText().length());//滚动条自动跟随
- }
待追加中。。。