如何让JPanel可滚动?

时间:2016-12-15 20:04:19

标签: java swing jscrollpane

我正在为我的大学项目创建GUI,并且我试图了解JScrollPane的工作原理。

我已经成功编写了一个简单的程序,以可滚动的方式显示图片:

public class ScrollPaneTest{
    public static void main(String[] args){
        JFrame testFrame = new JFrame("ramka testowa");
        testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel picture = new JLabel(new ImageIcon("JavaSwingCompoentsList.PNG"));
        JScrollPane scrollPane = new JScrollPane(picture);

        testFrame.add(scrollPane, BorderLayout.CENTER);
        testFrame.setSize(400, 400);
        testFrame.setVisible(true);
    }
}

虽然在我的最终图形用户界面中,我想仅将JScrollPane应用于其中的一部分,例如单JPanel。为了测试这个想法,我编写了以下代码,遗憾的是这些代码不起作用:

public class ScrollPaneTest{
    public static void main(String[] args){
        JFrame testFrame = new JFrame("ramka testowa");
        testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel picture = new JLabel(new ImageIcon("JavaSwingCompoentsList.PNG"));
        JScrollPane scrollPane = new JScrollPane(picture);

        JPanel insidePanel = new JPanel();
        insidePanel.add(scrollPane);
        testFrame.add(insidePanel, BorderLayout.CENTER);

        testFrame.setSize(400, 400);
        testFrame.setVisible(true);

    }
}

我已经阅读了大量的教程,以及Stack和CodeRanch的文章,但我仍然没有理解JScrollPane如何工作。我怀疑,我的错误与指定JPanel的尺寸有关 - 滚动,但我试过的每一种方法都没有给我滚动条或根本没有图片。

如果你能告诉我这个问题的正确解决办法,最重要的是,请告诉我错误的地方,我将非常感激。

3 个答案:

答案 0 :(得分:3)

  1. 使用图片
  2. 初始化JPanel,而不是JScrollPane
  3. 要将JPanel添加到JScrollPane,请执行:

    scrollPane.setViewportView (panel)
    
  4. JScrollPane,而非JPanel添加到JFrame

答案 1 :(得分:2)

最简单的方法是创建JPanel并在创建JScrollPane时指定它:

 JPanel myPanel = ...;
 JScrollPane scroller = new JScrollPane( myPanel );

然后只需将滚动条添加到GUI(而不是添加myPanel)。

答案 2 :(得分:2)

问题似乎来自内部面板的默认<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="200dp" app:cardCornerRadius="4dp" app:cardElevation="16dp" android:foregroundTint="@color/colorPrimary" android:layout_margin="8dp"> <RelativeLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="150dp" android:background="@color/colorPrimary"> <TextView android:id="@+id/image_card" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Title" android:textColor="@color/White" android:textSize="60sp" android:layout_centerInParent="true"/> </RelativeLayout> <RelativeLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/price_card" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000" android:textSize="18sp" android:textAppearance="@style/TextAppearance.AppCompat.Body2" android:layout_alignParentBottom="true" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" /> <TextView android:id="@+id/district_card" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Title" android:textColor="#000000" android:textSize="16sp" android:layout_above="@+id/price_card" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_marginRight="16dp" android:layout_marginEnd="16dp"/> <TextView android:id="@+id/date_card" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000" android:textSize="9.5sp" android:textAppearance="@style/TextAppearance.AppCompat.Body2" android:layout_alignBaseline="@+id/price_card" android:layout_alignBottom="@+id/price_card" android:layout_alignEnd="@+id/district_card" android:layout_alignRight="@+id/district_card"/> </RelativeLayout> </android.support.v7.widget.CardView> </LinearLayout> 。将其更改为另一个布局(我使用FlowLayout),它应该工作。话虽如此,我无法解释为什么流程布局失败!

BordeLayout