Java 将JPanel放入JScrollPanel中的问题

Java 将JPanel放入JScrollPanel中的问题,java,swing,jpanel,paintcomponent,Java,Swing,Jpanel,Paintcomponent,我正在做一个项目,我在一个JPanel上画一个图像,然后把这个面板放在一个JScrollPane中。面板本身的大小会有所不同,有时比屏幕小,有时比屏幕大。当它更大时,滚动窗格似乎没有任何滚动条出现。我肯定我把一些简单的事情搞糟了,但我似乎弄不明白 任何帮助都将非常感激 public void createGI(theTicket[] ticketArray){ JFrame ticketReportFrame = new JFrame(); ticketReportFrame.s

我正在做一个项目,我在一个JPanel上画一个图像,然后把这个面板放在一个JScrollPane中。面板本身的大小会有所不同,有时比屏幕小,有时比屏幕大。当它更大时,滚动窗格似乎没有任何滚动条出现。我肯定我把一些简单的事情搞糟了,但我似乎弄不明白

任何帮助都将非常感激

public void createGI(theTicket[] ticketArray){
    JFrame ticketReportFrame = new JFrame();
    ticketReportFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    JPanel ticketReport = new drawTurnoverReport(ticketArray , notes, tapes, turnover);
    ticketReport.setBackground(Color.WHITE);
    ticketReport.setLayout(new BorderLayout());
    JScrollPane ticketReportHolder = new JScrollPane(ticketReport);
    ticketReportFrame.setExtendedState(Frame.MAXIMIZED_BOTH);
    ticketReportFrame.pack();
    ticketReportHolder.setWheelScrollingEnabled(true);
    ticketReportFrame.add(ticketReportHolder);
    ticketReportFrame.setVisible(true);
    ticketReportFrame.setResizable(false);
}
这只是drawTurnoverReport的一小部分,试图帮助展示我在做什么

public class drawTurnoverReport extends JPanel{

   public drawTurnoverReport(theTicket[] tickets, String[] n, String[] t, String[] to){
        ticArray = tickets;
        notes = n;
        tapes = t;
        turnover = to;
        formalDate = mt.formalDate;
    }
    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent( g );
        Graphics2D g2 = (Graphics2D) g;



        //set fonts
        Font tahomaB = new Font("tahoma", Font.BOLD, 15);
        Font tahomaP = new Font("tahoma", Font.PLAIN, 15);

        //draw heading
        g2.setColor(Color.BLACK);
        g2.setFont(tahomaB);
        Rectangle2D rec = g2.getFontMetrics().getStringBounds("Turnover / Activity Log", g2);
        int stringW = (int) rec.getWidth();
        int prevStringH = (int) rec.getHeight();
        g2.drawString("Turnover / Activity Log", x-(stringW / 2) , 50);

        g2.setFont(tahomaP);
        rec = g2.getFontMetrics().getStringBounds("Date: " + formalDate, g2);
        stringW = (int) rec.getWidth();
        verticalPlace = 50 + prevStringH;
        g2.drawString("Date: " + formalDate, x-(stringW / 2) , verticalPlace);
        prevStringH = (int) rec.getHeight();
        verticalPlace += prevStringH;

        g2.setFont(tahomaB);
        rec = g2.getFontMetrics().getStringBounds("Service Manager Tickets", g2);
        stringW = (int) rec.getWidth();
        g2.drawString("Service Manager Tickets", x-(stringW / 2) , verticalPlace);
        verticalPlace +=2;
        g2.drawLine(((int)rec.getMinX()+ x)-(stringW / 2 +2), verticalPlace, 
                ((int)rec.getMaxX()+x)-(stringW / 2), verticalPlace);
        verticalPlace += 40;

        //draw table headers
        verticalUnderHeader = verticalPlace;
        g2.drawLine(50, verticalPlace, w-50, verticalPlace);
        rec = g2.getFontMetrics().getStringBounds(ticArray[0].getTicketNum(), g2);
        stringW = (int) rec.getWidth();
        rec = g2.getFontMetrics().getStringBounds("Ticket #", g2);
        temp = (int) rec.getWidth();
        g2.drawString("Ticket #", ((stringW+65+50)/2-(temp/2)), verticalPlace+17);
        horzPlace = stringW + 65;
        CNCxA = horzPlace;
        rec = g2.getFontMetrics().getStringBounds("Customer Name", g2);
        stringW = (int) rec.getWidth();
        widthCNC = (horzPlace + stringW + 30)-horzPlace;
        g2.drawString("Customer Name", horzPlace + 15, verticalPlace+17);
        horzPlace = horzPlace + stringW + 30;
        CNCxB = horzPlace;
        temp = w-horzPlace+30;
        DCx = temp;
        widthDC = temp - horzPlace;
        rec = g2.getFontMetrics().getStringBounds("Description", g2);
        stringW = (int) rec.getWidth();
        g2.drawString("Description", (horzPlace+temp)/2-(stringW/2), verticalPlace+17);
        rec = g2.getFontMetrics().getStringBounds("Status", g2);
        stringW = (int) rec.getWidth();
        g2.drawString("Status", (temp+(w-50))/2-(stringW/2), verticalPlace+17);
        verticalPlace += 20;
        g2.drawLine(50, verticalPlace, w-50, verticalPlace);
        verticalPlaceTemp = verticalPlace + 20;


    }
}

从声音上看,drawTurnoverReport组件没有向滚动窗格提供足够的大小提示信息

JScrollPane将使用components preferredSize来确定是否需要显示滚动条

确保覆盖getPreferredSize方法并返回适当大小的组件

例如:


这假设您正在执行某种自定义绘制,而不是使用类似JLabel的东西来渲染图像,这将表明您在某个地方存在布局问题…但是没有drawTurnoverReport的源,不可能知道……

您如何知道ticketReport JPanel比其JScrollPane容器变大的事实?您是否在JPanel中添加了一个监听器,例如ComponentListener,它报告JPanel大小的任何和所有变化,以证明您的假设是正确的?这样做,我敢打赌你会大吃一惊的。请注意,您发布的代码中没有任何内容可以帮助我们找出错误,这表明错误在其他地方,我猜您的JPanel没有您想象的那么大。@hovercraft嗯,我不知道为什么,这就是我来这里寻求帮助的原因。我很感激你的评论,但没必要这么严厉。我在描述中说的是,Jpanel比屏幕大,而不是比滚动窗格本身大。您是否建议我尝试设置滚动窗格的大小?你还想看到什么其他代码,我可以把整个drawTurnoverReport类放上去,但我不认为人们会需要300多行代码,我只是用它们来画图。drawTurnoverReport的大小是如何确定的?请解释我的苛刻。我只是对你的错误发表我的意见,我认为这就是你来这里的目的。我认为你在读我的文章中不存在的情感,你应该考虑在将来尝试不去做。我认为您应该做的是通过向面板添加ComponentListener来测试代码。再次亲眼看看发生了什么。同样,您已经声明JPanel在您的程序中的某些点变大,我要求您通过测试来调试您的程序。您可以覆盖getPreferredSize并返回图像的已知大小或默认大小,直到知道为止,一旦你知道图像的大小,请确保你正在调用revalidate…很抱歉问这个问题,我只是java新手,不过我正在尝试。我更新了drawTurnoverReport类的问题部分,试图帮助澄清。我假设您打算在同一个类中重写getPreferredSize方法,我只是不确定如何做。我看了你放进去的链接,但它们都使用预设图像,我无法确定如何使其适用于我的案例。根据构造器提供的信息,您应该能够生成可以绘制到组件的BuffereImage,或者计算显示所需的宽度和高度…感谢您的帮助,随着所有的反应,我的轮子开始转动,我在paintComponent方法的底部抛出了一行。此。设置首选尺寸新尺寸W-10,垂直位置;垂直位置是我在整个方法中用来保持垂直位置的位置,而w只是屏幕大小和宽度