Проблема с отображением данных на JscroillPane

 
 
 
Сообщения:27
Добрый день. Имеется следующий вопрос. Необходимо вывести несколько нарисованных графиков на экран. Как правило, они не помещаются на 1 стандартный размер экрана, следовательно, необходимо использовать JScrollPane. Графики вывожу на стандартную панель, друг за другом. В таком случае не отображается полоса прокрутки, часть выводимых данных оказывается вне границ отображения. Что я делаю не так? Почему-то напрямую на JScrollPane графики отобразить не получается. Для рисования графиков использую JFreeChart, если эта информация нужна.
 
 
Сообщения:87
а почему не помещаются ? такие требования к большому их разрешению ?
скорее всего ты что-то "налепил" в коде..
я мало еще разбираюсь, кстати тоже пытаюсь понять как чарты работают..

пример кода

	private void testMultiChart(){
		String[] names = {"SPY", "BID", "FB"};
		Chart chart = new Chart(names);
		SwingUtilities.invokeLater((Runnable) chart);
	}
        class Chart extends JFrame implements Runnable {
		private final String name;

		public Chart(String[] name) {
			super("multi");
			this.name = "multi";
			setMinimumSize(new Dimension(850, 550)); 
			JPanel main = new JPanel();
			main.setLayout(new BorderLayout());
			setContentPane(main);
			JPanel panel = new JPanel();
			panel.setLayout(new BorderLayout());
			JScrollPane pane = new JScrollPane(panel);
			main.add(pane);

			for (int i = 0; i < name.length; i++) {
				switch (i) {
					case 0:
						panel.add(get(name[i], TimeFrame.DAY), BorderLayout.NORTH);
						break;
					case 1:
						panel.add(get(name[i], TimeFrame.DAY), BorderLayout.CENTER);
						break;
					case 2:
						panel.add(get(name[i], TimeFrame.DAY), BorderLayout.SOUTH);
						break;
						default:
							break;
				}
			}
		}

		public ChartPanel get(String ticker, TimeFrame tf){
			DefaultHighLowDataset ds = createDataset(ticker, tf);
			ChartTheme darkness = StandardChartTheme.createDarknessTheme();
			ChartFactory.setChartTheme(darkness);
			JFreeChart chart = ChartFactory.createCandlestickChart(name, "", "", ds, false);
			XYPlot plot = (XYPlot) chart.getPlot();
			plot.setDomainPannable(true);
			NumberAxis axis = (NumberAxis) plot.getRangeAxis();

			axis.setAutoRangeIncludesZero(false);
			axis.setUpperMargin(0.0D);
			axis.setLowerMargin(0.0D);
			ChartPanel panel = new ChartPanel(chart);
			panel.setPreferredSize(new Dimension(800, 500));
			return panel;
		}

		private DefaultHighLowDataset createDataset(String ticker, TimeFrame tf) {
			Ticker ti = Data.getTestTicker(ticker, tf.getIndex());
			if (ti == null) {
				return null;
			}
			int size = (int) ti.getMaxIndex();
			Date[] date = new Date[size];
			double[] open = new double[size];
			double[] high = new double[size];
			double[] low = new double[size];
			double[] close = new double[size];
			double[] volume = new double[size];

			// i - индекс данных от 0 - последние полученные данные
			int index;
			for (int i = 0; i < size; i++) { //
				// пишем в массисы в обратном порядке
				index = size - 1 - i;
				date[index] = new Date((long) (ti.getValueByIndex(TickerParam.DATETIME, (long) i) * 1000));
				open[index] = ti.getValueByIndex(TickerParam.OPEN, (long) i);
				high[index] = ti.getValueByIndex(TickerParam.HIGH, (long) i);
				low[index] = ti.getValueByIndex(TickerParam.LOW, (long) i);
				close[index] = ti.getValueByIndex(TickerParam.CLOSE, (long) i);
				volume[index] = ti.getValueByIndex(TickerParam.VOLUME, (long) i);
			}

			return new DefaultHighLowDataset(name,date,high,low,open,close,volume);
		}

		@Override
		public void run() {
			setVisible(true);
		}
	}


код не будет у тебя работать, т.к. нужна своя реализация createDataset(), но тебе-то по сути нужно на конструктор только посмотреть Chart(String[] name)
Изменен:05 дек 2016 13:02
 
 
Сообщения:27
Спасибо, буду пробовать
 
 
Сообщения:27
Разобрался, оказывается, всё работает, просто слайдер прокрутки вместо вертикального горизонтальный выставляется, и вылезал за размеры рабочей области. Не знаете, как вместо горизонтального скролла вертикальный сделать? Контент добавляется почему-то не сверху вниз, а слева направо
Изменен:08 дек 2016 22:02
 
 
Сообщения:87
в моем примере в панели, куда добавляются чарты сделан компоновщик BorderLayout()
panel.setLayout(new BorderLayout());
ты можешь задать вертикальное расположение, например, так
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
и тогда добавляемые в panel чарты будут идти в столбик

что касается скролов, то они появляются автоматически, если не запрограммировано это отдельно - если например ширина скролпайн будет меньше, чем ширина добавляемых чартов, то появится скрол по ширине
Изменен:08 дек 2016 22:47
 
 
Сообщения:27
Хочу сказать вам спасибо, потому что ваш вариант оказался, как мне кажется, единственно верным! Я искал проблему в скроллпейне, а она оказалась в менеджере компоновки


Не могли бы мне подсказать, какой менеджер будет оптимальным, если таких столбиков с контентов должно быть несколько? Грубо говоря, заранее неизвестно, сколько столбиков (к примеру, чартов) будет размещено, это зависит от пользователя. Если пользователь захочет 1 стобик, сгенерируется один столбик чартов и добавиться на скролл. Если нужно будет 4 столбика, то они будут добавляться один за другим слева направо. Я так полагаю, что нужно выбрать гридлэйаут, и в качестве аргумента, который определяет количество столбиков, будет помещено число, введённое пользователем. Но можно ли в таком случае оставить другой аргумент пустым?
 
 
Сообщения:87
а чем не подходит BoxLayout как в примере выше ?
в конструкторе задаешь такой менеджер, в конструктор или отдельным методом передается какая-то ключевая информация (в виде массива или листа) о том, на основании чего строятся чарты добавляемые чарты, а зам по циклу просто добавляешь в панель создаваемые чарты..
подобно тому как написан цикл for в моем примере, по циклу каких то идентификаторов формируется чарт и добавляется в панель и тут не нужны какие-то парамтеры сколько их будет в столбик - сколько угодно..

может я неправильно понял твою ситуацию, и подразумевается какое-то более сложное манипулирование, типо выбрал критерий - сформировался один чарт, еще пару выбрал, еще два добавилось или что еще ?..
 
 
Сообщения:27
Бокс с изначально поставленной задачей справляется на ура, теперь задача немного усложняется. Имеется массив элементов. Если столбик один, то задача сводится к той, что я описывал с самого начала. Но вот если их хотя бы два, то на одном скроле необходимо разместить уже две панели с чертами. То есть черты на панель добавляются так, как вы описали, с помощью бокса, а вот как правильно размещать сами панели на сҡолл (панели должны располагаться друг за другом слева направо). Я так прикинул, вроде должен подойти гридлейаут. Типа одна строка, а количество столбцов равно количеству столбцов исходного массива. И в каждую полученную ячейку уже будет добавляться панель со своими чар ми. Тогда, по логике, у скролла будет два слайдеера: вертикальный для прокрутки чёртов и вертикальный для панелей
 
 
Сообщения:87
можно и GridLayout использовать, я правда им не пользовался, но есть методы для выставления количества колонок или строк (если не задавать их через конструктора)..
в принципе можно сделать динамически создаваемое размещение чартов на основе BoxLayout, что-то похожее на GridLayout
 
 
Сообщения:27
спасибо, буду пробовать
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет