请教两个Swing桌面开发的问题

zhao_rong 发布于 2012/01/28 18:43
阅读 576
收藏 0

大家好,请问两个Swing桌面开发的问题

1. 现在有一个JPanel,上面有一些JLabel,里面的字的字体和大小都是设定好的,但是现在这个JPanel太大了,一个屏幕显示不下去,我想做一个像word的视图缩放的功能,怎么实现?有没有什么思路?

    如果是简单的通过设置JPanel的大小的方法就不用说了,因为JLabel中的字体大小是没办法跟着外面的父控件大小同比例缩放的。

2. 网上有很多代码,是可以把JPanel保存为图片的(随便Google一下就能找到一堆),但这些代码都有个前提,就是这个JPanel必须先显示过,如果JPanel从来没有显示过,直接保存的图片就是全黑色的,原因是只有当JPanel显示在屏幕上时才会render。。。

有没有人能给点思路的,多谢。

加载中
0
Jeky
Jeky

第一个的问题我不清楚你的Panel上面都有什么组件,如果单纯是缩放组件的显示,可以考虑给Graphics设置scale,然后配合递归设置父容器和容器内所有控件大小就可以了

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.scale(scaleFactor, scaleFactor);
            super.paintComponent(g);
        }

不过这种解决不理想

还有一种解决方案是使用JXLayer里的TransformUI,我觉得也不理想....你可以去看看那个的范例

我觉得最理想的解决方案就是重新设计这个JPanel,规划成多个

 

第二个问题:

你试试这个代码:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;

/**
 *
 * @author Jeky
 */
public class SaveViewDemo {

    public static void saveViewToFile(Component view, File file) {
        JFrame frame = new JFrame();
        frame.add(view);
        frame.pack();
        Dimension size = view.getSize();

        BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        frame.getContentPane().paint(g);
        try {
            ImageIO.write(image, "jpeg", file);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        frame.dispose();
    }

    public static void main(String[] args) {
        //测试新建一个JPanel,并将其存入一个文件
        JPanel panel = new JPanel();
        panel.add(new JLabel("ABCD"));
        panel.add(new JTextField("aaaa"));
        Object[][] data = new Object[30][2];
        for (int i = 0; i < 30; i++) {
            data[i][0] = "A " + i;
            data[i][1] = "B" + i;
        }
        panel.add(new JScrollPane(new JTable(data,
                                             new String[]{"Column 1", "Column 2"})));
        panel.add(new JButton("button"));

        saveViewToFile(panel, new File("1.jpg"));
    }
}

 

0
拉登他哥
拉登他哥
忘记了...
zhao_rong
zhao_rong
谢谢。。。不要打击我了。。。哎。。
0
ExtremeTalk
ExtremeTalk
不是一定要显示出来才能保存图片的,这个我以前做过,具体代码可能要找找看了~~
0
zhao_rong
zhao_rong

引用来自“Jeky”的答案

第一个的问题我不清楚你的Panel上面都有什么组件,如果单纯是缩放组件的显示,可以考虑给Graphics设置scale,然后配合递归设置父容器和容器内所有控件大小就可以了

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.scale(scaleFactor, scaleFactor);
            super.paintComponent(g);
        }

不过这种解决不理想

还有一种解决方案是使用JXLayer里的TransformUI,我觉得也不理想....你可以去看看那个的范例

我觉得最理想的解决方案就是重新设计这个JPanel,规划成多个

 

第二个问题:

你试试这个代码:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;

/**
 *
 * @author Jeky
 */
public class SaveViewDemo {

    public static void saveViewToFile(Component view, File file) {
        JFrame frame = new JFrame();
        frame.add(view);
        frame.pack();
        Dimension size = view.getSize();

        BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        frame.getContentPane().paint(g);
        try {
            ImageIO.write(image, "jpeg", file);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        frame.dispose();
    }

    public static void main(String[] args) {
        //测试新建一个JPanel,并将其存入一个文件
        JPanel panel = new JPanel();
        panel.add(new JLabel("ABCD"));
        panel.add(new JTextField("aaaa"));
        Object[][] data = new Object[30][2];
        for (int i = 0; i < 30; i++) {
            data[i][0] = "A " + i;
            data[i][1] = "B" + i;
        }
        panel.add(new JScrollPane(new JTable(data,
                                             new String[]{"Column 1", "Column 2"})));
        panel.add(new JButton("button"));

        saveViewToFile(panel, new File("1.jpg"));
    }
}

 

非常感谢你!

关于第一个问题,我昨天也想到用你说的这个scale  graphic的办法,我这个JPanel嵌套了好多组件,而且其中的一些组件还要操作,一操作子组件,子组件就变成原来的大小,是个很麻烦的事情。

关于第二个问题,我发现如果JPanel的大小一旦超过屏幕的大小,它就只能打印显示在屏幕上的部分,比如一张A4纸大小的图片,只能打印出上面2/3的部分(我这是宽屏笔记本)。这个我自己想想办法,看看能不能用ScrollPane解决问题,谢谢你的指点。

返回顶部
顶部