Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

jScrollPaneの垂直スクロールバーがスライドしない

罫線&項目名などを描画したJPanel(BoxScorePanel)をJScrollPaneを利用し垂直スクロールバーでスクロールしてJPanel(BoxScorePanel)を表示させたいのです。
現状ではViewPortにJPanel(BoxScorePanel)は表示されているのですが、強制表示させた垂直スクロールバーにスライドさせるツマミ(正しい名称がわかりません。)が表示されず垂直スクロールバーが動作しません。
基本的なことかもしれませんが、どうしてもわかりません。
どうか教えて下さい。

以下はJPanel(BoxScorePanel)を表示させるBoxScorePreviewのコードです。
import javax.swing.JPanel;
import javax.swing.JViewport;
import org.dyno.visual.swing.layouts.Constraints;
import org.dyno.visual.swing.layouts.GroupLayout;
import org.dyno.visual.swing.layouts.Leading;

@SuppressWarnings("serial")
public class BoxScorePreview extends JPanel {
    
    private SheetDisplay BoxScoreDisplay;

    public BoxScorePreviewP() {
        initComponents();
    }

    private void initComponents() {
        setLayout(new GroupLayout());
        add(getBoxScoreDisplay(), new Constraints(new Leading(2, 787, 10, 10), new Leading(3, 387, 10, 10)));

        setSize(788, 410);
    }

    private SheetDisplay getBoxScoreDisplay() {
        if (BoxScoreDisplay == null) {
            
            SheetDisplay BoxScoreDisplay = new SheetDisplay();

            BoxScorePanel bsp = new BoxScorePanel();
            
            //以下はビューポート
            JViewport view = new JViewport();
           
            view.setView(bsp);
            
            BoxScoreDisplay.jScrollPane0.setViewport(view);
        }
        return BoxScoreDisplay;
    }  
}

以下はSheetDisplayのコードです。
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.dyno.visual.swing.layouts.Constraints;
import org.dyno.visual.swing.layouts.GroupLayout;
import org.dyno.visual.swing.layouts.Leading;

@SuppressWarnings("serial")
public class SheetDisplay extends JPanel{

    JScrollPane jScrollPane0;
    
    public SheetDisplay() {
        initComponents();
    }

    private void initComponents() {
        setLayout(new GroupLayout());
        add(getJScrollPane0(), new Constraints(new Leading(0, 787, 10, 10), new Leading(0, 388, 10, 10)));
        setSize(787, 388);
    }

    private JScrollPane getJScrollPane0() {
        if (jScrollPane0 == null) {
            
            jScrollPane0 = new JScrollPane();
            
            //垂直スクロールバーは常に表示
            jScrollPane0.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            
        }

        return jScrollPane0;
    }
}

7

回答

92347

閲覧

7件の回答

評価

0

その後コードを見なおして以下のようにし、垂直スクロールバーは必要な場合に表示するよう改変しましたが、実行するとJPanel(BoxScorePanel)は問題なく表示されるものの垂直スクロールバーは表示されません。
JPanel(BoxScorePanel)はA4余白アリのサイズのsetSize(452, 698)としています。
基本的なことかもしれませんが教えて下さい。
どうか宜しくお願いします。

以下は改変したコードです。
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.dyno.visual.swing.layouts.Constraints;
import org.dyno.visual.swing.layouts.GroupLayout;
import org.dyno.visual.swing.layouts.Leading;

//VS4E -- DO NOT REMOVE THIS LINE!
@SuppressWarnings("serial")
public class BoxScoreDisplay extends JPanel{

    JScrollPane jScrollPane0;
    
    public BoxScoreDisplay() {
        // TODO Auto-generated constructor stub
        initComponents();
    }

    private void initComponents() {
        setLayout(new GroupLayout());
        add(getJScrollPane0(), new Constraints(new Leading(0, 787, 10, 10), new Leading(0, 388, 10, 10)));
        setSize(787, 388);
    }

    private JScrollPane getJScrollPane0() {
        if (jScrollPane0 == null) {
            
            BoxScorePanel bsp = new BoxScorePanel();
            
            jScrollPane0 = new JScrollPane(bsp);
            
            //垂直スクロールバーは必要な場合に表示
            jScrollPane0.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        }
        return jScrollPane0;
    }
}

評価

30

例えばJScrollPaneの大きさを表示してみたり、枠を付けて視
覚的に確認したり。
基本的なデバッグの仕方を覚えよう。

評価

0

日にちがたったからもう解決したかな?
setSize は レイアウトを決める側の物です。
setPreferredSize や setMinimumSize で大きさを主張しないと。

評価

0

$さん、仙人さん、基本的な質問に回答をいただきありがとうございます。

コードを以下のように書き換えてみました。
追加したコードは最下部の以下になります。

//JScrolPaneに、スクロールバーを出すべきサイズを伝える
    public Dimension getPreferredSize() {
        //A4サイズ
        return new Dimension(452,698);
    }

BoxScorePanelを1.7倍サイズに表示するg2.setTransform(af);のコードを削除して、1倍にして実行させるとJScrollPaneに垂直スクロールバーが出現しスライダーを使用してスクロールするとBoxScorePanelは問題なく表示できるようになりました。

しかしながらg2.setTransform(af);のコードを再び加えて1.7倍で表示させてJScrollPaneでスクロールさせようとするとスライダーは動作するものの、BoxScorePanelの表示は乱れてBoxScorePanelが2重にズレて表示されてしまい最後までスクロールすることが出来ませんでした。

どう対処すべきか申し訳ありませんが教えて下さい。
宜しくお願いします。

以下はBoxScorePanelのコードです。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;

import javax.swing.JPanel;

import org.dyno.visual.swing.layouts.GroupLayout;

public class BoxScorePanel extends JPanel implements Printable{

    private static final long serialVersionUID = 1L;

    public BoxScorePanel() {
        initComponents();
    }

    private void initComponents() {
        setLayout(new GroupLayout());
    }
    
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        drawPage(g2);//display page
        //背景色を白に
        setBackground(Color.WHITE);
    }

    public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
        if (page >= 1) return Printable.NO_SUCH_PAGE;
        Graphics2D g2 = (Graphics2D)g;
        g2.translate(pf.getImageableX(), pf.getImageableY());
        
        System.out.println("A4 Size:"+pf.getImageableWidth()+" "+pf.getImageableHeight());
        
        //印刷用のボックススコアラインの表示
        BoxScoreLine bsl1 = new BoxScoreLine();
        bsl1.paintComponent(g2);
    
        return Printable.PAGE_EXISTS;
    }

    public void drawPage(Graphics2D g2){
    //1ピクセルが1ポイント
    //A4縦は600*840ポイント
    //余白を1インチ(2.54mm)とすると、A4縦の印字領域は 451*697 ピクセル
        
       AffineTransform af = new AffineTransform();

        double[] flatmatrix = new double[6];
        af.getMatrix(flatmatrix);
        printMatrix(flatmatrix);

        System.out.println();
        
        //1.7倍にスケールアップ
        af.setToScale(1.7d, 1.7d);

        af.getMatrix(flatmatrix);
        printMatrix(flatmatrix);

        g2.setTransform(af);
        
        //170%表示のボックススコアライン
        BoxScoreLine bsl2 = new BoxScoreLine();
        bsl2.paintComponent(g2);
    }
    
    //1.7倍コンソール確認用
    public static void printMatrix(double[] flatmatrix){
        System.out.print("[ " + flatmatrix[0] + " ");
        System.out.print(flatmatrix[2] + " ");
        System.out.println(flatmatrix[4] + " ]");

        System.out.print("[ " + flatmatrix[1] + " ");
        System.out.print(flatmatrix[3] + " ");
        System.out.println(flatmatrix[5] + " ]");
    }
    
    //JScrolPaneに、スクロールバーを出すべきサイズを伝える
    public Dimension getPreferredSize() {
        //A4サイズ
        return new Dimension(452,698);
    }
}

評価

0

なんで「set…」と書かれてるのに、getを書いてるんだろう。

>どう対処すべきか申し訳ありませんが教えて下さい。
で、それ以外のことは何を調べて、何を試した?
分からないから即質問では、なんら力にならんよ。

評価

0

g2.setTransform(af);が乱れる原因でしょうか?
g2.transform(af);でお試しください。
最後まで表示されないについては
Dimension(452,698);が1.7倍になっているのかご確認を。

評価

0

仙人さん、回答をいただきましてありがとうございます。
ご指摘された通りにコードを改変することで実現しました。
setTransformではなくtransformを使用することはまったく考えていなかっただけに非常に助かりました。
本当にありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。