[JAVA] JList -> JTextArea


(Venice3000) #1

Witam, jestem wlasnie w trakcie konczenia systemu eksperckiego, ale przyznam, że właśnie ze Swinga jestem zielony.

Na koniec systemu eksperckiego wyświetlam pasujące możliwości z objaśnieniami. Metodą porównania z innym kodem wyszło mi całkiem fajnie JList i wyswietla w liście wszystkie możliwości.

Ale z uwagi że jest brak zawijania wierszy, jest to nie do zaakceptowania.

Wyszukalem ze JTextArea ma możliwość zawijania i stąd moja prośba o pomoc w przełożeniu kodu JList na JTextArea.

Okienko teraz wygląda tak jak ponizej:

3a288dfeb8838d96347616aecca085.jpeg

Kod użyty do wygenerowania tego okienka to:

JFrame k = new JFrame("YourStone - possibilities");

            k.setPreferredSize(new Dimension(600, 600));

            k.setMinimumSize(new Dimension(400, 400));

            k.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            DefaultListModel model = new DefaultListModel();

            for(int y = 0; y 500 y conclusionHandle.listValue().size(); y++)

                model.addElement((new StringBuilder()).append(y + 1).append(". ").append(tablica[y]).toString());


            JList list = new JList(model);

            list.setSize(200, 200);

            k.setBounds(350, 140, 440, 580);

            list.setVisibleRowCount(-1);

            list.setSelectionMode(1);

            list.setLayoutOrientation(JList.HORIZONTAL_WRAP);

            JScrollPane s = new JScrollPane(list);

            s.setSize(new Dimension(200, 200));

            k.add(s);    

            k.pack();

            k.setVisible(true);

Proszę o pomoc.


(Trance) #2

aby stworzyć sobie JTextArea ze zwijaniem wierszy tworzysz po prostu obiekt JTextArea a następnie wywołujesz na jego rzecz metodę setLineWrap(true);

przykład (kod napisany na "szybko")

import java.util.*;

import javax.swing.*;

import java.awt.*;

class Okno extends JFrame

{

    Okno()

    {

   setLayout(null);

   setSize(400,400);

   JTextArea pole_t=new JTextArea();

   pole_t.setBounds(0,0,300,300);

   pole_t.setLineWrap(true);

   setMinimumSize(new Dimension(300, 300));

   add(pole_t);

   show();

   setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

public class Main {  

 public static void main(String[] args) {            

Okno o=new Okno();

    }

}

(Venice3000) #3

Dzieki, myslalem że trzeba bardziej kombinować z tym JTextArea, ale udało mi sie łatwo to doprowadzic do porządku.

Teraz moje kolejne pytanie.

Ze strony http://www.java2s.com/Code/Java/2D-Graphics-GUI/ImageViewer.htm

skompilowalem kodzik przegladarki obrazków,

ale jest problem.

Co blokuje wyświetlanie zdjęć spoza folderu klasy ? (nie wyświetla zdjęć/obrazków z innego miejsca niż folder w którym znajduje się program)

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.File;


import javax.swing.ImageIcon;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;


public class ImageViewer extends JFrame implements ActionListener {

  public ImageViewer() {

    setTitle("ImageViewer");

    setSize(300, 400);


    JMenuBar mbar = new JMenuBar();

    JMenu m = new JMenu("File");

    openItem = new JMenuItem("Open");

    openItem.addActionListener(this);

    m.add(openItem);

    exitItem = new JMenuItem("Exit");

    exitItem.addActionListener(this);

    m.add(exitItem);

    mbar.add(m);

    setJMenuBar(mbar);


    label = new JLabel();

    Container contentPane = getContentPane();

    contentPane.add(label, "Center");

  }


  public void actionPerformed(ActionEvent evt) {

    Object source = evt.getSource();

    if (source == openItem) {

      JFileChooser chooser = new JFileChooser();

      chooser.setCurrentDirectory(new File("."));


      chooser.setFileFilter(new javax.swing.filechooser.FileFilter() {

        public boolean accept(File f) {

          return f.getName().toLowerCase().endsWith(".gif")

              || f.isDirectory();

        }


        public String getDescription() {

          return "GIF Images";

        }

      });


      int r = chooser.showOpenDialog(this);

      if (r == JFileChooser.APPROVE_OPTION) {

        String name = chooser.getSelectedFile().getName();

        label.setIcon(new ImageIcon(name));

      }

    } else if (source == exitItem)

      System.exit(0);

  }


  public static void main(String[] args) {

    JFrame frame = new ImageViewer();

    frame.show();

  }


  private JLabel label;


  private JMenuItem openItem;


  private JMenuItem exitItem;

}

(Trance) #4

nie wiem czy dobrze Cię zrozumiałem bo nie testowałem otwierania plików z katalogu programu... ale otwieranie GIF'ów z dowolnego miejsca na dysku będzie Ci działać po podmianie:

String name = chooser.getSelectedFile().getName();

na

String name = chooser.getSelectedFile().getAbsolutePath();

(Venice3000) #5

Dzieki, zadziałało.

Pozostała mi tylko jedna niewiadoma przed zakonczenie projektu.

Otóż mam JFrame w ktorym ładuję na jedynym panelu obrazek.

Jak ustawić dla ramki:

setPreferredSize(new Dimension(...));

setMinimumSize(new Dimension(...));

setSize(...)

i dla panelu:

setLayout

aby ramka dopasowywala się do wielkosci zdjecia ?

Powiedzmy że wysokość (jak i szerokość) fotek bedzie wynosila 300-500px


(Trance) #6

a więc dla przykładu który był powyżej do podmiany z:

if (r == JFileChooser.APPROVE_OPTION) {

            String name = chooser.getSelectedFile().getAbsolutePath();

            label.setIcon(new ImageIcon(name));

          }

na

if (r == JFileChooser.APPROVE_OPTION) {

            String name = chooser.getSelectedFile().getAbsolutePath();

ImageIcon p=new ImageIcon(name);

            label.setIcon(p);

            setSize(p.getIconWidth()+6,p.getIconHeight()+50);

          }

i tu małe wyjaśnienie: setSize(p.getIconWidth()+6,p.getIconHeight()+50);

ustawiamy szerokość okna na szerokość label + szerokość obu obramowań okna (po prawej i lewej stronie okna) - ustawiłem na 6px a wysokość okna na wysokość label + wysokość paska tytułowego + paska menu + dolne obramowanie okna (ustawione 50 px)


(Venice3000) #7

Trance dzieki Ci bardzo za odpowiedzi.

Udało mi się wszystko do konca ogarnąć.


(Trance) #8

Nie ma za co :slight_smile: