2017-01-02 1 views
0

(EDIT 2) Эй, ребята, я не очень много времени, поэтому я выложу это быстро, я получил эту проблему случиться в меньшей программе:значок Java Resizable JLabel только держит больше

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.imageio.ImageIO; 
import javax.swing.DefaultListModel; 
import javax.swing.GroupLayout; 
import javax.swing.GroupLayout.Alignment; 
import javax.swing.JScrollPane; 
import javax.swing.LayoutStyle.ComponentPlacement; 
import javax.swing.JTextField; 
import javax.swing.JList; 
import javax.swing.JToolBar; 
import javax.swing.event.ListSelectionListener; 
import javax.swing.event.ListSelectionEvent; 
import java.awt.Color; 
import javax.swing.border.LineBorder; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 

public class Main extends JFrame { 

private JPanel contentPane; 
private JTextField txtWhatTheHell; 

private static ArrayList<ImageIcon> thumbslist = new ArrayList<ImageIcon>(); 
public static DefaultListModel model = new DefaultListModel(); 


private static void initialize_pix() throws IOException 
{ 
    File filefolder = new File("pix"); 
    File[] pictures = filefolder.listFiles(); 


    for(File a: pictures) 
    { 
     Image tempimage = ImageIO.read(a); 
     ImageIcon perimage = new ImageIcon(tempimage); 

     thumbslist.add(perimage); 
    } 
    model.addElement(filefolder.toString()); 
} 

public static ImageIcon resize(ImageIcon source, JLabel label) 
{ 

    int height = label.getHeight(); 
    int width = label.getWidth(); 

    Image original = source.getImage(); 

    BufferedImage resized = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D graphics = resized.createGraphics(); 

    graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    graphics.drawImage(original, 0, 0, width, height, null); 
    graphics.dispose(); 

    ImageIcon result = new ImageIcon(resized); 

    return result; 
} 







public static void main(String[] args) { 
    try { 
     initialize_pix(); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Main frame = new Main(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public Main() { 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 731, 563); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 

    JScrollPane scrollPane = new JScrollPane(); 

    txtWhatTheHell = new JTextField(); 
    txtWhatTheHell.setText("Text"); 
    txtWhatTheHell.setEditable(false); 
    txtWhatTheHell.setColumns(10); 

    JToolBar toolBar = new JToolBar(); 
    toolBar.setFloatable(false); 

    JLabel label = new JLabel(""); 
    label.addComponentListener(new ComponentAdapter() { 
     @Override 
     public void componentResized(ComponentEvent a) { 


      label.setIcon(resize(thumbslist.get(0), label)); 
     } 
    }); 
    label.setBorder(new LineBorder(new Color(0, 0, 0))); 
    label.setBackground(Color.GRAY); 
    GroupLayout gl_contentPane = new GroupLayout(contentPane); 
    gl_contentPane.setHorizontalGroup(
     gl_contentPane.createParallelGroup(Alignment.LEADING) 
      .addGroup(gl_contentPane.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING) 
        .addComponent(toolBar, GroupLayout.DEFAULT_SIZE, 685, Short.MAX_VALUE) 
        .addGroup(gl_contentPane.createSequentialGroup() 
         .addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 491, GroupLayout.PREFERRED_SIZE) 
         .addPreferredGap(ComponentPlacement.RELATED) 
         .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING) 
          .addComponent(label, GroupLayout.DEFAULT_SIZE, 188, Short.MAX_VALUE) 
          .addComponent(txtWhatTheHell, GroupLayout.DEFAULT_SIZE, 188, Short.MAX_VALUE)))) 
       .addContainerGap()) 
    ); 
    gl_contentPane.setVerticalGroup(
     gl_contentPane.createParallelGroup(Alignment.TRAILING) 
      .addGroup(gl_contentPane.createSequentialGroup() 
       .addComponent(toolBar, GroupLayout.PREFERRED_SIZE, 85, GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(ComponentPlacement.UNRELATED) 
       .addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING) 
        .addGroup(gl_contentPane.createSequentialGroup() 
         .addComponent(txtWhatTheHell, GroupLayout.DEFAULT_SIZE, 162, Short.MAX_VALUE) 
         .addPreferredGap(ComponentPlacement.RELATED) 
         .addComponent(label, GroupLayout.PREFERRED_SIZE, 239, GroupLayout.PREFERRED_SIZE)) 
        .addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 407, Short.MAX_VALUE)) 
       .addContainerGap()) 
    ); 

    JList list = new JList(model); 
    list.addListSelectionListener(new ListSelectionListener() { 
     public void valueChanged(ListSelectionEvent a) { 

      if(list.isSelectionEmpty() == true) 
      { 
       return; 
      } 
      else 
      { 
       label.setIcon(thumbslist.get(0)); 
      } 


     } 
    }); 
    scrollPane.setViewportView(list); 
    contentPane.setLayout(gl_contentPane); 
} 
} 

Файл в начале - это файл с картинками. . Я действительно не уверен, что с ним не так.

(EDIT 3) Я сделал aa задержку после каждого экземпляра, вызвавшего прослушиватель размера, и в первый раз правильно изменилась, то после этого она начинает расти из-под контроля

Я думаю, что @HovercraftFullOfEels подумал об этом, но я просто точно не знаю, что делать, чтобы изменить его размер только один раз при каждом изменении размера рамки.

ответ

3

У вас есть рекурсия, которая происходит внутри вашего компонента слушатель. Так как вы увеличиваете размер значка JLabel в своем собственном ComponentListener, слушатель уведомляется об изменении размера, что увеличивает размер значка, который уведомляет слушателя об изменении размера ....

Возможное решение : подумайте об отключении слушателя внутри себя, чтобы эта рекурсия не произошла, а затем снова включила ее. Один из способов сделать это - просто удалить, а затем снова добавить слушателя в себя.

например,

Label thumbchanger = new JLabel(); 
thumbchanger.addComponentListener(new ComponentAdapter() { 
    @Override 
    public void componentResized(ComponentEvent a) { 
     // remove the *this* component listener before resizing 
     thumbchanger.removeComponentListener(this); 
     Mod current_mod = Globals.modList.get(list.getSelectedIndex()); 
     ImageIcon new_icon = Globals.resize(current_mod.get_current(), thumbchanger); 
     thumbchanger.setIcon(new_icon); 
     // re-add the component listener after done resizing 
     thumbchanger.addComponentListener(this); 
    } 
}); 

Другим способ заключается в использовании логического поля локального слушателя, который вы установили в нем.

thumbchanger.addComponentListener(new ComponentAdapter() { 
    private boolean resizing = false; 

    @Override 
    public void componentResized(ComponentEvent a) { 
     if (resizing) { 
      return; 
     } 

     resizing = true; 

     Mod current_mod = Globals.modList.get(list.getSelectedIndex()); 
     ImageIcon new_icon = Globals.resize(current_mod.get_current(), thumbchanger); 
     thumbchanger.setIcon(new_icon); 

     resizing = false; 
    } 
}); 
+0

Большое спасибо за ответ, но, к сожалению, он полностью не разрешил мою проблему. Использование одного из этих методов не позволяет даже активировать прослушиватель изменения размера. Я просто не понимаю, что с ним не так, потому что я использую ТОЧНЫЙ САМОЙ метод в другой программе, и он работает просто отлично! –

+1

@MinhazMurks: тогда вам нужно 1) создать и опубликовать в качестве редактирования вашего вопроса действительный [sscce] (http://sscce.org) и 2) подробно описать ваше ожидаемое и наблюдаемое поведение. –

+0

Эй, я обновил свою проблему наилучшим образом, я мог –

Смежные вопросы